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.
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 !
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.