1

私はPythonが初めてで、コードの一部に少し苦労しています。Rundeck API のオープン ソース Python クライアントである rundeckrun を使用しています。クライアントには、Python 2.7+ にロックされているように見えるコードが 1 つあり、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"、getattr(self, k, None) が None でない場合、node_attr_keys の k の 135 行目} ^ SyntaxError: 無効な構文

4

3 に答える 3

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)
于 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 に答える