1

我是 Python 新手,在一段代码上有点挣扎。我正在使用 rundeckrun,它是 Rundeck API 的开源 python 客户端。客户端中有一段代码似乎被锁定到 python 2.7+,我真的需要让它在 Python 2.6 上工作。我试过搜索,但什至不知道这个结构叫什么很难找到它的 2.6 等价物。

node_attr_keys = (
        'name',
        'hostname',
        'username',
        'description',
        'osArch',
        'osFamily',
        'osName',
        'editUrl',
        'remoteUrl',
    )

    data = {k: getattr(self, k)
            for k in node_attr_keys if getattr(self, k, None) is not None}

具体错误是:

文件“/usr/lib/python2.6/site-packages/rundeckrun-0.1.11-py2.6.egg/rundeck/client.py”,第 21 行,在 from .api 中导入 RundeckApiTolerant、RundeckApi、RundeckNode 文件“/ usr/lib/python2.6/site-packages/rundeckrun-0.1.11-py2.6.egg/rundeck/api.py”,如果 getattr(self, k, None) 不是 None,则为 node_attr_keys 中的 k 第 135 行} ^ SyntaxError: 无效的语法

4

3 回答 3

1

那是字典理解。Python 2.6 不支持它们。您提供的代码大致相当于以下代码:

node_attr_keys = (
 # Same as your code, omitted for brevity
)
data = {}
for k in node_attr_keys:
    if getattr(self, k, None) is not None:
        data[k] = getattr(self, k)
于 2014-11-06T19:39:58.963 回答
1

正如凯文所指出的,这是一种字典理解。

dict在 Python 2.6 中,您可以将其编写为生成元组(键/值对)列表并将其传递给构造函数的生成器表达式:

data = dict((k, getattr(self, k))
             for k in node_attr_keys if getattr(self, k, None) is not None)
于 2014-11-06T19:44:53.177 回答
0

除了这个错误,人们可能会因为同样的原因得到以下错误。

File "/usr/lib/python2.6/site-packages/rundeck/transforms.py", line 256
_transforms = {obj_key: obj_val for obj_key, obj_val in locals().items() if hasattr(obj_val, '__is_transform__')}
                                  ^

SyntaxError:无效的语法

  File "/usr/lib/python2.6/site-packages/rundeck/util.py", line 22
return {c.tag: c.text for c in el}
                        ^

SyntaxError:无效的语法

File "/usr/lib/python2.6/site-packages/rundeck/util.py", line 36
return {k: v for k, v in el.items()}
               ^

SyntaxError:无效的语法

File "/usr/lib/python2.6/site-packages/rundeck/util.py", line 58
return {k: kwargs.pop(k) for k in api_keys if k in kwargs}

您可能必须应用与 kindall 给出的相同的修复程序。只需分别修改文件如下。

_transforms = dict((obj_key, obj_val) for obj_key, obj_val in locals().items() if hasattr(obj_val, '__is_transform__'))
 return dict((c.tag, c.text) for c in el)
return dict((k, v) for k, v in el.items())
return dict((k, kwargs.pop(k)) for k in api_keys if k in kwargs)

信贷去kindall。

于 2016-03-05T09:53:14.557 回答