Jinja: Fügen Sie bitweise Operatoren hinzu

Erstellt am 10. Juli 2013  ·  9Kommentare  ·  Quelle: pallets/jinja

Der Vollständigkeit halber sollten die bitweisen Operatoren erlaubt sein. Derzeit muss man Folgendes tun, um eine Verschiebung an einer ganzen Zahl durchzuführen.

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

Alle 9 Kommentare

Bitweise Operationen sollten nicht in Vorlagen verwendet werden. Stellen Sie Funktionen bereit, wenn Sie dies benötigen.

Wow, das ist ein rechthaberischer Standpunkt.

Ich verwende Jinja mit Home Assistant und bearbeite RGB-Farben. Ich möchte {'r': 255, 'g': 255, 'b': 255} als 0xRRGGBB -Format rendern, aber kein Glück, weil Jinja diese praktischen Funktionen nicht bietet.

Was ist Ihr Vorschlag, um dies zu umgehen? Das Implementieren von Funktionen würde zwar funktionieren, aber was, wenn jemand 0xBBGGRR will? Ist es nicht Jinjas Aufgabe, den Benutzer über das Rendering entscheiden zu lassen?
Ich stimme zu, dass eine Funktion wie diese nicht missbraucht werden sollte, aber es gibt Anwendungsfälle dafür.

Tut mir leid, wenn Sie diesen Kommentar hart finden, das ist nicht meine Absicht. Ich bin echt verzweifelt :cry:

Dafür brauchen Sie keine bitweisen Operatoren. Verwenden Sie einfach die Zeichenfolgenformatierung:

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

Danke, ich habe eine Möglichkeit hinzugefügt, es wieder in Dezimalzahlen umzuwandeln

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

Mir ist aufgefallen, dass Sie .format anstelle des Filters format verwenden . Ich bin etwas verwirrt, was in einer Jinja-Vorlage erlaubt ist und was nicht. Was ist der bevorzugte Weg, dies zu tun? Wann verwendet man das eine oder das andere?

Zitat des Zen von Python: There should be one-- and preferably only one --obvious way to do it.

Bitte benutzen Sie IRC oder die Mailingliste für diese Art von Diskussion.

Auch die Verwendung des Filters format wäre möglich:

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

Der format -Filter umschließt im Grunde nur den Modulo-Operator und aktiviert Pythons alten String-Formatierungsmechanismus . Die format -Methode hingegen stammt nicht einmal von jinja2, sondern ist eine eingebaute Methode von str - und unicode -Objekten in Python und wird für verwendet der neue String-Formatierungsmechanismus .

In Python wird der neue Mechanismus dem alten vorgezogen, aber in jinja2 behalten wir gerne eine stabile API bei. Wenn die Abwärtskompatibilität nicht gegeben wäre, hätten wir wahrscheinlich den format -Filter entfernt oder geändert. Ich bin mir nicht sicher, was ich hier vorschlagen soll, ich denke, verwenden Sie einfach, was Sie bevorzugen.

Aber ja, diese Diskussion wird vom Thema abgeschweift, und dies ist wahrscheinlich nicht der richtige Ort, um sie fortzusetzen.

Ich brauche auch bitweise Operationen - zumindest Vergleiche. Ich habe einen Sensor in HomeAssistant, der einen Bitmaskenwert verwendet, um mehrere Zustände in einem Wert darzustellen. Im HomeAssistant möchte ich diesen Bitmaskenwert in einzelne Sensorwerte aufteilen, was mit einem einfachen {{ state(sensor.with_bitmaskvalue) & 1 }} als Wertevorlage für meinen Sensor einfach zu bewerkstelligen wäre. Im Moment ist es fast unmöglich, dies über eine Jinja-Vorlage zu tun - zumindest nach meinen Recherchen

Klingt so, als sollten sie einen benutzerdefinierten Test wie state(sensor.with_bitmaskvalue) is bitmask 1

Entschuldigung für das Rauschen, ich habe gerade festgestellt, dass sie einen benutzerdefinierten Filter bitwise_and() hinzugefügt haben, der den Zweck für mich erfüllt

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen