Фильтрация 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
попробуйте (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)
)
Приятно знать, спасибо.
Самый полезный комментарий
Более читаемый и гораздо более понятный, что он делает