Для полноты побитовые операторы должны быть разрешены. В настоящее время нужно сделать следующее, чтобы выполнить сдвиг целого числа.
{{ (12).__rshift__(other) }}
Побитовые операции не должны использоваться в шаблонах. Выставляйте функции, если вам нужно.
Вау, это самоуверенная точка зрения.
Я обнаружил, что использую jinja с Home Assistant и манипулирую цветами RGB. Я хочу отобразить {'r': 255, 'g': 255, 'b': 255}
в формате 0xRRGGBB
, но не повезло, потому что jinja не имеет этих удобных функций.
Что вы предлагаете обойти это? Реализация функций действительно сработает, но что, если кто-то захочет 0xBBGGRR
? Разве работа jinja не заключается в том, чтобы позволить пользователю решать, что делать с рендерингом?
Я согласен, что такой функцией не следует злоупотреблять, но есть варианты ее использования.
Извините, если этот комментарий покажется вам резким, это не моя цель. Я сталкиваюсь с настоящим отчаянием :cry:
Для этого вам не нужны побитовые операторы. Просто используйте форматирование строки:
{{ '0x{r:02X}{g:02X}{b:02X}'.format(**color) }}
Спасибо, я добавил способ преобразовать его обратно в десятичный формат.
{{ '0x{r:02X}{g:02X}{b:02X}'.format(**color) | int(base=16) }}
Я заметил, что вы используете .format
вместо фильтра format
. Я немного смущен, чтобы узнать, что разрешено, а что запрещено в шаблоне jinja. Каков предпочтительный способ сделать это? Когда использовать тот или иной?
Цитируя дзен Python: There should be one-- and preferably only one --obvious way to do it.
Пожалуйста, используйте IRC или список рассылки для такого рода обсуждений.
Также возможно использование фильтра format
:
{{ '0x%(r)02X%(g)02X%(b)02X'|format(**color) }}
Фильтр format
в основном просто обертывает оператор по модулю, позволяя использовать старый механизм форматирования строк Python. С другой стороны, метод format
даже не исходит из jinja2, а является встроенным методом объектов str
и unicode
в Python и используется для новый механизм форматирования строк .
В Python новый механизм предпочтительнее старого, но в jinja2 нам нравится поддерживать стабильный API. Если бы не обратная совместимость, я думаю, мы могли бы удалить или изменить фильтр format
. Я не уверен, что предложить здесь, я думаю, просто используйте то, что вы предпочитаете.
Но да, эта дискуссия становится не по теме, и, вероятно, это не подходящее место для ее продолжения.
Мне также нужны побитовые операции - хотя бы сравнения. У меня есть датчик в HomeAssistant, который использует значение битовой маски для представления нескольких состояний в одном значении. В HomeAssistant я хочу разделить это значение битовой маски на отдельные значения датчика, что было бы легко сделать с помощью простого {{ state(sensor.with_bitmaskvalue) & 1 }}
в качестве шаблона значения для моего датчика. Прямо сейчас это почти невозможно сделать с помощью шаблона Jinja - по крайней мере, согласно моим исследованиям.
Похоже, они должны предоставить пользовательский тест, такой как state(sensor.with_bitmaskvalue) is bitmask 1
извините за шум, я только что обнаружил, что они добавили собственный фильтр bitwise_and()
, который помогает мне