Jinja: Ajouter des opérateurs au niveau du bit

Créé le 10 juil. 2013  ·  9Commentaires  ·  Source: pallets/jinja

Pour être complet, les opérateurs au niveau du bit doivent être autorisés. Actuellement, il faut faire ce qui suit pour effectuer un décalage sur un entier.

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

Tous les 9 commentaires

Les opérations au niveau du bit ne doivent pas être utilisées dans les modèles. Exposez les fonctions si vous en avez besoin.

Wow, c'est un point de vue opiniâtre.

Je me retrouve à utiliser jinja avec Home Assistant et à manipuler les couleurs RVB. Je veux rendre {'r': 255, 'g': 255, 'b': 255} au format 0xRRGGBB mais pas de chance car jinja ne vient pas avec ces fonctionnalités pratiques.

Quelle est votre suggestion pour contourner ce problème ? L'implémentation de fonctions fonctionnerait en effet, mais que se passe-t-il si quelqu'un veut 0xBBGGRR ? N'est-ce pas le travail de jinja de laisser l'utilisateur décider du rendu ?
Je suis d'accord qu'il ne faut pas abuser d'une fonctionnalité comme celle-ci, mais il existe des cas d'utilisation.

Désolé si vous trouvez ce commentaire dur, ce n'est pas mon intention. Je fais face au vrai désespoir :cry:

Vous n'avez pas besoin d'opérateurs au niveau du bit pour cela. Utilisez simplement le formatage de chaîne :

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

Merci, j'ai ajouté un moyen de le reconvertir en décimal

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

Je remarque que vous utilisez .format au lieu du filtre format . Je suis un peu confus de savoir ce qui est autorisé et ce qui n'est pas autorisé dans un modèle jinja. Quelle est la manière préférée de le faire ? Quand utiliser l'un ou l'autre ?

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

Veuillez utiliser IRC ou la liste de diffusion pour ce genre de discussion.

L'utilisation du filtre format serait également possible :

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

Le filtre format enveloppe simplement l'opérateur modulo, activant l' ancien mécanisme de formatage de chaîne de Python . La méthode format , d'autre part, ne vient même pas de jinja2, mais est une méthode intégrée des objets str et unicode en Python, et utilisée pour le nouveau mécanisme de formatage des chaînes .

En Python, le nouveau mécanisme est préféré à l'ancien, mais en jinja2, nous aimons maintenir une API stable. Si ce n'était pas pour la rétrocompatibilité, je pense que nous aurions peut-être supprimé ou modifié le filtre format . Je ne sais pas quoi suggérer ici, je suppose, utilisez simplement celui que vous préférez.

Mais oui, cette discussion devient hors sujet, et ce n'est probablement pas le bon endroit pour la poursuivre.

J'ai également besoin d'opérations au niveau du bit - au moins des comparaisons. J'ai un capteur dans HomeAssistant qui utilise une valeur de masque de bits pour représenter plusieurs états en une seule valeur. Dans HomeAssistant, je souhaite diviser cette valeur de masque de bits en valeurs de capteur individuelles, ce qui serait facile à faire avec un simple {{ state(sensor.with_bitmaskvalue) & 1 }} comme modèle de valeur pour mon capteur. À l'heure actuelle, il est presque impossible de le faire via un modèle Jinja - du moins selon mes recherches

On dirait qu'ils devraient exposer un test personnalisé tel que state(sensor.with_bitmaskvalue) is bitmask 1

désolé pour le bruit, je viens de découvrir qu'ils ont ajouté un filtre personnalisé bitwise_and() qui fait l'affaire pour moi

Cette page vous a été utile?
0 / 5 - 0 notes