Jinja: bool to string фильтр не работает

Созданный на 6 авг. 2018  ·  14Комментарии  ·  Источник: pallets/jinja

Ожидаемое поведение

Фильтрация bool до string должна дать True или False в зависимости от значения.

Фактическое поведение

Фильтрация bool до string всегда дает 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

Ваша среда

  • Версия Python: 2.7
  • Версия Jinja: не знаю версию Jinja, Ansible 2.5.4

Самый полезный комментарий

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

Более читаемый и гораздо более понятный, что он делает

Все 14 Комментарий

попробуйте (6>0)|... или даже лучше, буквальное логическое значение, такое как true|... или false|...

Да, (6>0)|... работает. Почему этот отчет об ошибке закрыт?

Потому что это не ошибка, а просто приоритет оператора. Без круглых скобок ваш код, вероятно, работал как 6 > (0|string) , что, очевидно, не имеет смысла, но в других операциях, таких как 6 > '5'|int , это имеет смысл, так что это не ошибка и не непреднамеренное поведение.

Исходя из мира Unix/Linux, где | обозначает разделитель конвейера, это неожиданно.

Я думаю, что это должно быть 6 > ('5'|int) вместо того, чтобы нуждаться в таких приведениях.

Я не согласен, и это также будет серьезное изменение.

Можно хотя бы предупреждение?

Реальный вариант использования для этого — шаблоны Ansible для логических свойств Java:
isEnabled={{ some_var | length > 0 | string | lower }}
потому что я хочу isEnabled=true/false вместо isEnabled=True/False .

Это было бы более читабельно как isEnabled={{ ((some_var | length) > 0) | string | lower }} (по крайней мере, для меня), что, как я полагаю, будет работать, как и ожидалось.

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

Более читаемый и гораздо более понятный, что он делает

Ну, я вижу, мы читаем это по-разному, и сейчас Джиндзя читает так же, как и ты. Но худшая часть приведенного выше нерабочего примера заключается в том, что он всегда молча дает False .

Я знаю, что Python доволен этим, но как вы думаете, стоит ли выдавать предупреждение при использовании > между int и string в шаблонах Jinja?

Также поделитесь своим мнением о фильтре |is_empty , который можно использовать вместо |lenght > 0 .

В любом случае, спасибо за ваши быстрые ответы. Хорошей недели.

Ansible может добавить это. Точно так же, как они сделали с |bool , который также не является частью самой Jinja.

Я знаю, что Python доволен этим, но как вы думаете, стоит ли выдавать предупреждение при использовании > между int и string в шаблонах Jinja?

Не проверял это, но, вероятно, это не работает в Python 3, где такие сравнения громко терпят неудачу, а не молча достигают успеха с несколько бесполезным результатом. Jinja не выполняет проверки типов, поэтому он просто передает два операнда в Python (код не проверял, возможно, для этого он вызывает operator.gt(a, b) )

Приятно знать, спасибо.

Была ли эта страница полезной?
0 / 5 - 0 рейтинги