Jinja: Добавить побитовые операторы

Созданный на 10 июл. 2013  ·  9Комментарии  ·  Источник: pallets/jinja

Для полноты побитовые операторы должны быть разрешены. В настоящее время нужно сделать следующее, чтобы выполнить сдвиг целого числа.

{{ (12).__rshift__(other) }}

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

Побитовые операции не должны использоваться в шаблонах. Выставляйте функции, если вам нужно.

Вау, это самоуверенная точка зрения.

Я обнаружил, что использую 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() , который помогает мне

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

Смежные вопросы

AMDmi3 picture AMDmi3  ·  4Комментарии

humiaozuzu picture humiaozuzu  ·  3Комментарии

harobed picture harobed  ·  6Комментарии

priestc picture priestc  ·  5Комментарии

mitsuhiko picture mitsuhiko  ·  3Комментарии