zonelistを次のようなデータ構造とします。
[{'zones': ['pe.com', 'ps.de', 'p-s.de'], 'file': 'gm'},
{'zones': ['p-e.net', 'ps.net', 'p-s.net'], 'file': 'grpc'}]
zonelist | map(attribute = 'file')を使用すると、次のような文字列が返されます。
<generator object do_map at 0x10bd730>
予想される動作は、zonelistの「file」属性を含むリストを返すことです。
回避策があります。たとえば、zonelist | map(attribute = 'file') | listまたはzonelist | map(attribute = 'file') | sortを使用すると、期待されるリストが作成されます。
[gm, grpc]
Jinja2.7.1とAnsible1.4.3を使用しています。
これはバグではありません。 JSONを出力しようとしていますか?
はい、私の期待は、map()がリストを返すことでした。 そして、それはバグではありませんか? つまり、map()は、| joinや| listなどの他のフィルターが追加された中間関数としてのみ使用されるということですか? うーん。 たぶん、それはドキュメントに明示的に記載されるべきです。
任意のPythonオブジェクトのrepr
を印刷して、Javascriptに直接フィードするべきではありません。 あなたの場合、内容によっては運が良かったように見えましたが、実際には無効なJSONを取得する可能性があり、それは大きなセキュリティ上の欠陥である可能性もあります。 list
フィルターとtojson
フィルターを追加して、有効なJSONを取得するか、オブジェクトがJSONにエンコードできない場合は例外を取得します。
ほとんどのPythonビルトインのrepr
がJSONっぽいという事実は偶然ではありませんが、reprは実際のプログラムロジックに依存すべきものではありません。
また、 Jinjaのドキュメントには、 map
がシーケンスよりも具体的なものを返すことを意味する場所がありません。
これを変更すると、通常は反復でのみ使用されるこれらの関数のパフォーマンスが低下するため、変更したくありません。 |list
それを修正します。
私は、ansbile <generator object do_map at 0xdeadbeef>
問題の{{ ... | list }}
ソリューションについて知りません<generator object do_map at 0xdeadbeef>
。
これを提出してくれてありがとう!
最も参考になるコメント
これを変更すると、通常は反復でのみ使用されるこれらの関数のパフォーマンスが低下するため、変更したくありません。
|list
それを修正します。