为了完整起见,应该允许使用按位运算符。 目前,必须执行以下操作才能对整数执行移位。
{{ (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,而是 Python 中str
和unicode
对象的内置方法,用于新的字符串格式化机制。
在 Python 中,新机制比旧机制更受欢迎,但在 jinja2 中,我们喜欢维护一个稳定的 API。 如果不是为了向后兼容,我想我们可能已经删除或更改了format
过滤器。 我不知道在这里建议什么,我猜,只是使用你喜欢的任何一个。
但是,是的,这个讨论变得离题了,这可能不是继续讨论的正确地方。
我也需要按位运算 - 至少是比较。 我在 HomeAssistant 中有一个传感器,它使用位掩码值在一个值中表示多个状态。 在 HomeAssistant 中,我想将此位掩码值拆分为单独的传感器值,这很容易使用简单的{{ state(sensor.with_bitmaskvalue) & 1 }}
作为传感器的值模板来完成。 现在几乎不可能通过 Jinja 模板做到这一点——至少根据我的研究
听起来他们应该公开一个自定义测试,例如state(sensor.with_bitmaskvalue) is bitmask 1
抱歉,我刚刚发现他们添加了一个自定义过滤器bitwise_and()
这对我有用