Jinja: le filtre map() renvoie la chaîne "<generator object="" do_map="" at="">"</generator>

Créé le 3 janv. 2014  ·  7Commentaires  ·  Source: pallets/jinja

Soit zonelist une structure de données comme celle-ci :

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

Lors de l'utilisation de zonelist|map(attribute='file'), une chaîne comme celle-ci est renvoyée :

<generator object do_map at 0x10bd730>

Le comportement attendu serait de renvoyer une liste contenant les attributs 'fichier' de zonelist.

Il s'avère qu'il existe une solution de contournement : en utilisant par exemple zonelist|map(attribute='file') |list ou zonelist|map(attribute='file') |sort donnera la liste attendue :

[gm, grpc]

J'utilise Jinja 2.7.1 avec Ansible 1.4.3.

Commentaire le plus utile

Je ne veux pas changer cela car cela entraînerait une baisse des performances de ces fonctions qui ne sont normalement utilisées qu'avec l'itération. |list répare.

Tous les 7 commentaires

Ce n'est pas un bug. Essayez-vous de sortir JSON ?

Oui, je m'attendais à ce que map() renvoie une liste. Et ce n'est pas un bug ? Cela signifie donc que map() ne doit être utilisé que comme fonction intermédiaire avec un autre filtre comme |join ou |list ajouté? Hmmm. Peut-être que cela devrait être indiqué explicitement dans la documentation.

Vous ne devriez pas simplement imprimer les repr d'objets Python arbitraires pour les alimenter directement en Javascript. Dans votre cas, vous sembliez avoir de la chance, selon le contenu, cependant, vous pourriez en fait obtenir un JSON invalide, et cela pourrait également être une énorme faille de sécurité. Ajoutez les filtres list et tojson pour obtenir un JSON valide, ou une exception lorsque l'objet n'est pas encodable en JSON.

Le fait que le repr de la plupart des fonctions intégrées de Python soit JSON-ish n'est pas une coïncidence, mais le repr n'est jamais quelque chose sur lequel on devrait s'appuyer pour la logique du programme réel.

De plus, je ne vois nulle part dans la documentation de Jinja ce qui implique que map renverrait quelque chose de plus spécifique qu'une séquence.

Je ne veux pas changer cela car cela entraînerait une baisse des performances de ces fonctions qui ne sont normalement utilisées qu'avec l'itération. |list répare.

Je ne connaissais pas la solution {{ ... | list }} pour le problème ansbile <generator object do_map at 0xdeadbeef> .

Merci d'avoir déposé ça !

Cette page vous a été utile?
0 / 5 - 0 notes

Questions connexes

navilan picture navilan  ·  5Commentaires

hvnsweeting picture hvnsweeting  ·  4Commentaires

AMDmi3 picture AMDmi3  ·  4Commentaires

jp-costa picture jp-costa  ·  5Commentaires

mitsuhiko picture mitsuhiko  ·  3Commentaires