Jinja: map()フィルターは文字列 "を返します<generator object="" do_map="" at="">「」</generator>

作成日 2014年01月03日  ·  7コメント  ·  ソース: pallets/jinja

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を使用しています。

最も参考になるコメント

これを変更すると、通常は反復でのみ使用されるこれらの関数のパフォーマンスが低下するため、変更したくありません。 |listそれを修正します。

全てのコメント7件

これはバグではありません。 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>

これを提出してくれてありがとう!

このページは役に立ちましたか?
0 / 5 - 0 評価