Jinja: El filtro map () devuelve la cadena "<generator object="" do_map="" at="">"</generator>

Creado en 3 ene. 2014  ·  7Comentarios  ·  Fuente: pallets/jinja

Deje que zonelist sea una estructura de datos como esta:

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

Cuando se usa zonelist | map (atributo = 'archivo'), se devuelve una cadena como esta:

<generator object do_map at 0x10bd730>

El comportamiento esperado sería devolver una lista que contenga los atributos de 'archivo' de zonelist.

Resulta que hay una solución alternativa: el uso, por ejemplo, de lista de zonas | mapa (atributo = 'archivo') | lista o | ordenar dará como resultado la lista esperada:

[gm, grpc]

Estoy usando Jinja 2.7.1 con Ansible 1.4.3.

Comentario más útil

No quiero cambiar esto ya que esto haría que el rendimiento de estas funciones se reduzca, lo que normalmente solo se usa con iteración. |list corrige.

Todos 7 comentarios

Esto no es un error. ¿Estás intentando generar JSON?

Sí, mi expectativa era que map () devuelva una lista. ¿Y eso no es un error? ¿Eso significa que map () solo se usará como una función intermedia con algún otro filtro como | join o | list adjunto? Mmm. Quizás eso debería indicarse explícitamente en la documentación.

No debería simplemente imprimir los repr de objetos arbitrarios de Python para alimentarlos directamente en Javascript. En su caso, pareció tener suerte, dependiendo del contenido, sin embargo, es posible que obtenga un JSON no válido y también podría ser una gran falla de seguridad. Agregue los filtros list y tojson para obtener JSON válido, o una excepción cuando el objeto no se puede codificar en JSON.

El hecho de que repr de la mayoría de las incorporaciones de Python sea JSON no es una coincidencia, pero la repr nunca es algo en lo que uno deba confiar para la lógica real del programa.

Además, no veo en ningún lugar de los documentos de Jinja, lo que implica que map devolvería algo más específico que una secuencia.

No quiero cambiar esto ya que esto haría que el rendimiento de estas funciones se reduzca, lo que normalmente solo se usa con iteración. |list corrige.

No sabía sobre la solución {{ ... | list }} para el problema ansbile <generator object do_map at 0xdeadbeef> .

¡Gracias por archivar esto!

¿Fue útil esta página
0 / 5 - 0 calificaciones