我是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行,在 来自.api导入RundeckApiTolerant,RundeckApi,RundeckNode 文件“/usr/lib/python2.6/site-packages/rundeckrun-0.1.11-py2.6.egg/rundeck/api.py”,第135行 对于node_attr_keys中的k,如果getattr(self,k,None)不是None} ^ SyntaxError:语法无效
答案 0 :(得分: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)
答案 1 :(得分:1)
凯文指出,这是字典理解。
在Python 2.6中,您可以将其编写为生成器表达式,生成元组列表(键/值对)并将其传递给dict
构造函数:
data = dict((k, getattr(self, k))
for k in node_attr_keys if getattr(self, k, None) is not None)
答案 2 :(得分: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)
归功于善意。