Jinja: ビット演算子を追加する

作成日 2013年07月10日  ·  9コメント  ·  ソース: pallets/jinja

完全を期すために、ビット演算子を許可する必要があります。 現在、整数のシフトを実行するには、次のことを行う必要があります。

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

全てのコメント9件

テンプレートではビット演算を使用しないでください。 必要に応じて関数を公開します。

うわー、それは意見のある見方です。

Home Assistantでjinjaを使用し、RGBカラーを操作していることに気づきました。 {'r': 255, 'g': 255, 'b': 255}0xRRGGBB形式でレンダリングしたいのですが、jinjaにはこれらの便利な機能がないため、運がありません。

これを回避するためのあなたの提案は何ですか? 関数の実装は確かに機能しますが、誰かが0xBBGGRR必要としている場合はどうなりますか? ユーザーにレンダリングを決めさせるのはjinjaの仕事ではありませんか?
このような機能を悪用してはならないことに同意しますが、その使用例があります。

このコメントが厳しいと感じた場合は申し訳ありませんが、これは私の意図ではありません。 私は本当の絶望に直面しています:cry:

そのためにビット演算子は必要ありません。 文字列の書式設定を使用するだけです。

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

ありがとう、10進数に戻す方法を追加しました

{{ '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に、ビットマスク値を使用して1つの値で複数の状態を表すセンサーがあります。 HomeAssistantでは、このビットマスク値を個々のセンサー値に分割します。これは、センサーの値テンプレートとして単純な{{ state(sensor.with_bitmaskvalue) & 1 }}を使用すると簡単に実行できます。 今のところ、Jinjaテンプレートを介してこれを行うことはほぼ不可能です-少なくとも私の研究によれば

state(sensor.with_bitmaskvalue) is bitmask 1などのカスタムテストを公開する必要があるようです

ノイズでごめんなさい、私はちょうど彼らが私のためにトリックをするカスタムフィルターbitwise_and()を追加したことを発見しました

このページは役に立ちましたか?
0 / 5 - 0 評価