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