Jinja: o filtro map () retorna a string "<generator object="" do_map="" at="">"</generator>

Criado em 3 jan. 2014  ·  7Comentários  ·  Fonte: pallets/jinja

Deixe zonelist ser uma estrutura de dados como esta:

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

Ao usar zonelist | map (attribute = 'file'), uma string como esta é retornada:

<generator object do_map at 0x10bd730>

O comportamento esperado seria retornar uma lista contendo os atributos de 'arquivo' de zonelist.

Acontece que há uma solução alternativa: usar, por exemplo, zonelist | map (attribute = 'file') | list ou zonelist | map (attribute = 'file') | sort resultará na lista esperada:

[gm, grpc]

Estou usando o Jinja 2.7.1 com Ansible 1.4.3.

Comentários muito úteis

Não quero mudar isso, pois isso faria com que o desempenho dessas funções diminuísse, as quais normalmente são usadas apenas com iteração. |list corrige isso.

Todos 7 comentários

Este não é um bug. Você está tentando gerar JSON?

Sim, minha expectativa era que map () retornasse uma lista. E isso não é um bug? Então isso significa que map () deve ser usado apenas como uma função intermediária com algum outro filtro como | join ou | list anexado a ele? Hmmm. Talvez isso deva ser declarado explicitamente na documentação.

Você não deve apenas imprimir repr de objetos Python arbitrários para alimentar diretamente em Javascript. No seu caso, você parecia ter sorte, dependendo do conteúdo, no entanto, você pode realmente obter JSON inválido e também pode ser uma grande falha de segurança. Anexe os filtros list e tojson para obter um JSON válido ou uma exceção quando o objeto não for codificável para JSON.

O fato de que repr da maioria dos builtins do Python são JSON não é uma coincidência, mas a repr nunca é algo em que se deva confiar para a lógica real do programa.

Além disso, não vejo nenhum lugar nos documentos do map retornaria algo mais específico do que uma sequência.

Não quero mudar isso, pois isso faria com que o desempenho dessas funções diminuísse, as quais normalmente são usadas apenas com iteração. |list corrige isso.

Eu não sabia sobre a solução {{ ... | list }} para o problema ansbile <generator object do_map at 0xdeadbeef> .

Obrigado por preencher isso!

Esta página foi útil?
0 / 5 - 0 avaliações