Jinja: Agregar operadores bit a bit

Creado en 10 jul. 2013  ·  9Comentarios  ·  Fuente: pallets/jinja

Para completar, se deben permitir los operadores bit a bit. Actualmente, uno tiene que hacer lo siguiente para realizar un cambio en un número entero.

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

Todos 9 comentarios

Las operaciones bit a bit no deben usarse en plantillas. Exponer funciones si es necesario.

Wow, ese es un punto de vista obstinado.

Me encuentro usando jinja con Home Assistant y manipulando colores RGB. Quiero renderizar {'r': 255, 'g': 255, 'b': 255} como formato 0xRRGGBB pero no tuve suerte porque jinja no viene con esas características útiles.

¿Cuál es su sugerencia para solucionar esto? La implementación de funciones funcionaría, pero ¿qué pasa si alguien quiere 0xBBGGRR ? ¿No es el trabajo de jinja dejar que el usuario decida la representación?
Estoy de acuerdo en que no se debe abusar de una característica como esta, pero hay casos de uso para ello.

Lo siento si encuentras este comentario duro, no es mi intención. Me enfrento a la verdadera desesperación :cry:

No necesita operadores bit a bit para eso. Simplemente use el formato de cadena:

{{ '0x{r:02X}{g:02X}{b:02X}'.format(**color) }}

Gracias, agregué una forma de volver a convertirlo a decimal.

{{ '0x{r:02X}{g:02X}{b:02X}'.format(**color) | int(base=16) }}

Veo que usas .format en lugar del filtro format . Estoy un poco confundido para saber qué está permitido y qué no está permitido en una plantilla jinja. ¿Cuál es la forma preferida de hacer esto? ¿Cuándo usar uno u otro?

Citando el zen de Python: There should be one-- and preferably only one --obvious way to do it.

Utilice el IRC o la lista de correo para este tipo de discusión.

También sería posible usar el filtro format :

{{ '0x%(r)02X%(g)02X%(b)02X'|format(**color) }}

El filtro format básicamente envuelve el operador de módulo, habilitando el antiguo mecanismo de formateo de cadenas de Python. El método format , por otro lado, ni siquiera proviene de jinja2, pero es un método integrado de objetos str y unicode en Python, y se usa para el nuevo mecanismo de formateo de cadenas .

En Python, se prefiere el nuevo mecanismo al anterior, pero en jinja2 nos gusta mantener una API estable. Si no fuera por la compatibilidad con versiones anteriores, creo que podríamos haber eliminado o cambiado el filtro format . No estoy seguro de qué sugerir aquí, supongo, solo usa lo que prefieras.

Pero sí, esta discusión se está desviando del tema y probablemente este no sea el lugar adecuado para continuarla.

También necesito operaciones bit a bit, al menos comparaciones. Tengo un sensor en HomeAssistant que usa un valor de máscara de bits para representar varios estados en un valor. En HomeAssistant, quiero dividir este valor de máscara de bits en valores de sensor individuales, lo que sería fácil de hacer con un simple {{ state(sensor.with_bitmaskvalue) & 1 }} como plantilla de valor para mi sensor. En este momento, es casi imposible hacer esto a través de una plantilla de Jinja, al menos según mi investigación.

Parece que deberían exponer una prueba personalizada como state(sensor.with_bitmaskvalue) is bitmask 1

Perdón por el ruido, acabo de descubrir que agregaron un filtro personalizado bitwise_and() que me funciona

¿Fue útil esta página
0 / 5 - 0 calificaciones