2014-11-06 146 views
1

我是Python的新手,並且爲一段代碼掙扎了一下。我正在使用rundeckrun,它是Rundeck API的開源Python客戶端。客戶端中有一段代碼似乎被鎖定到python 2.7+,我真的需要讓它在Python 2.6上工作。我嘗試過搜索,但甚至不知道這個構造是如何很難找到它的2.6等價物。Python 2.6與rundeckrun的兼容

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 import RundeckApiTolerant,RundeckApi,RundeckNode 文件「/usr/lib/python2.6/site-packages/rundeckrun-0.1.11-py2.6.egg/rundeck/api.py」,行135 對於k在node_attr_keys如果GETATTR(個體,K,無)不是無} ^ 語法錯誤:無效的語法

+0

[Python 2.7之前的替代dict理解]可能的重複(http://stackoverflow.com/questions/21069668/alternative-to-dict-comprehension-prior-to-python-2-7) – 2014-11-06 19:39:42

+0

^它是稱爲「詞典理解」。希望這個其他問題有幫助。 – 2014-11-06 19:40:08

+0

感謝大家的快速回復! – moshjeier 2014-11-06 20:00:50

回答

1

正如Kevin指出的那樣,這是字典理解。

在Python 2.6,你可以把它寫成一個發電機表達產生的元組(鍵/值對)的列表,並傳遞到dict構造:

data = dict((k, getattr(self, k)) 
      for k in node_attr_keys if getattr(self, k, None) is not None) 
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) 
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__')} 
           ^

語法錯誤:無效的語法

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

語法錯誤:無效的語法

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

語法錯誤:無效的語法

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) 

Credit to kindall。