Jinja: bool para filtro de string não funciona

Criado em 6 ago. 2018  ·  14Comentários  ·  Fonte: pallets/jinja

Comportamento esperado

Filtrar bool para string deve dar True ou False respectivamente do valor.

Comportamento real

Filtrar bool para string sempre dá False .

Código do modelo

Paste the template code (ideally a minimal example) that causes the issue

'{{6 > 0}}' ==> True
'{{6 > 0|string}}' ==> False
'{{6 > 0|bool}}' ==> True
'{{6 > 0|bool|string}}' ==> False

Seu ambiente

  • Versão do Python: 2.7
  • Versão Jinja: Não conheço a versão Jinja, o Ansible é 2.5.4

Comentários muito úteis

{{ (some_var|length > 0) | string | lower }}

Mais legível e muito mais claro o que faz

Todos 14 comentários

tente (6>0)|... ou ainda melhor, um booleano literal como true|... ou false|...

Sim, (6>0)|... funciona. Por que este relatório de bug foi fechado?

Porque não é um bug, mas simplesmente a precedência do operador. Sem parênteses seu código provavelmente estava rodando como 6 > (0|string) que obviamente não faz sentido, mas em outras operações como 6 > '5'|int faz muito sentido, então isso não é um bug nem um comportamento não intencional.

Vindo do mundo Unix/Linux onde | denota um delimitador de pipeline, isso é inesperado.

Eu acho que deveria ser 6 > ('5'|int) em vez disso quando precisar de tais moldes.

Eu discordo, e isso também seria uma mudança massiva.

Podemos ter pelo menos um aviso?

O caso de uso do mundo real para isso são as propriedades booleanas Java do modelo Ansible:
isEnabled={{ some_var | length > 0 | string | lower }}
porque eu quero isEnabled=true/false em vez de isEnabled=True/False .

Isso seria mais legível como isEnabled={{ ((some_var | length) > 0) | string | lower }} (pelo menos para mim), o que acredito funcionaria conforme o esperado.

{{ (some_var|length > 0) | string | lower }}

Mais legível e muito mais claro o que faz

Bem, vejo que lemos de forma diferente e Jinja atualmente lê como você. Mas a pior parte do exemplo acima que não funciona é que ele sempre dá silenciosamente False .

Eu sei que o Python está feliz com isso, mas você acha que é uma boa ideia emitir um aviso ao usar > entre int e string em modelos Jinja?

Também compartilhe sua opinião sobre um filtro |is_empty para usar em vez de |lenght > 0 .

De qualquer forma, obrigado por suas respostas rápidas. Tenha uma boa semana.

O Ansible pode adicionar isso. Assim como eles fizeram com |bool que também não faz parte de Jinja.

Eu sei que o Python está feliz com isso, mas você acha que é uma boa ideia emitir um aviso ao usar > entre int e string em modelos Jinja?

Não testei, mas provavelmente ele falha no Python 3, onde essas comparações falham alto em vez de silenciosamente ter sucesso com um resultado um tanto inútil. Jinja não faz verificações de tipo, então ele apenas passa os dois operandos para o Python (não verificou o código, provavelmente ele chama operator.gt(a, b) para isso)

Bom saber, obrigado.

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

Questões relacionadas

glasserc picture glasserc  ·  4Comentários

harobed picture harobed  ·  6Comentários

samatjain picture samatjain  ·  5Comentários

Yannik picture Yannik  ·  4Comentários

humiaozuzu picture humiaozuzu  ·  3Comentários