Filtrar bool
para string
deve dar True
ou False
respectivamente do valor.
Filtrar bool
para string
sempre dá False
.
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
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.
Comentários muito úteis
Mais legível e muito mais claro o que faz