Jinja: map()-Filter gibt die Zeichenfolge "<generator object="" do_map="" at="">"</generator>

Erstellt am 3. Jan. 2014  ·  7Kommentare  ·  Quelle: pallets/jinja

Lassen Sie zonelist eine Datenstruktur wie diese sein:

[{'zones': ['pe.com', 'ps.de', 'p-s.de'], 'file': 'gm'},
 {'zones': ['p-e.net', 'ps.net', 'p-s.net'], 'file': 'grpc'}]

Bei Verwendung von zonelist|map(attribute='file') wird ein String wie dieser zurückgegeben:

<generator object do_map at 0x10bd730>

Das erwartete Verhalten wäre, eine Liste mit den 'file'-Attributen von zonelist zurückzugeben.

Wie sich herausstellt, gibt es einen Workaround: Die Verwendung von zB zonelist|map(attribute='file') |list oder zonelist|map(attribute='file') |sort führt zu der erwarteten Liste:

[gm, grpc]

Ich verwende Jinja 2.7.1 mit Ansible 1.4.3.

Hilfreichster Kommentar

Ich möchte dies nicht ändern, da dies die Leistung dieser Funktionen beeinträchtigen würde, die normalerweise nur mit Iteration verwendet werden. |list behebt es.

Alle 7 Kommentare

Dies ist kein Fehler. Versuchen Sie, JSON auszugeben?

Ja, meine Erwartung war, dass map() eine Liste zurückgibt. Und das ist kein Bug? Das bedeutet also, dass map() nur als Zwischenfunktion mit einem anderen Filter wie |join oder |list verwendet werden soll? Hmmm. Vielleicht sollte das explizit in der Dokumentation angegeben werden.

Sie sollten nicht einfach die repr beliebiger Python-Objekte ausgeben, um sie direkt in Javascript einzugeben. In Ihrem Fall scheinen Sie Glück zu haben, je nach Inhalt können Sie jedoch tatsächlich ungültiges JSON erhalten, und es könnte auch eine große Sicherheitslücke sein. Hängen Sie die Filter list und tojson an, um gültiges JSON oder eine Ausnahme zu erhalten, wenn das Objekt nicht für JSON kodierbar ist.

Die Tatsache, dass repr der meisten Python-Buildins JSON-artig ist, ist kein Zufall, aber der Repr ist nie etwas, auf das man sich für die eigentliche Programmlogik verlassen sollte.

Außerdem sehe ich nirgendwo in den Jinja-Dokumenten, was impliziert, dass map etwas spezifischeres als eine Sequenz zurückgeben würde.

Ich möchte dies nicht ändern, da dies die Leistung dieser Funktionen beeinträchtigen würde, die normalerweise nur mit Iteration verwendet werden. |list behebt es.

Ich wusste nichts von der {{ ... | list }} Lösung für das ansbile <generator object do_map at 0xdeadbeef> Problem.

Danke, dass du das eingereicht hast!

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen