rundeckrun的Python 2.6兼容性

时间:2014-11-06 19:37:13

标签: python python-2.7 python-2.6 rundeck

我是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:语法无效

3 个答案:

答案 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)

归功于善意。