Jinja: Jinja2 NativeEnvironmentは、テンプレート内の要素間に一重引用符をドロップしてレンダリングします

作成日 2019年06月19日  ·  1コメント  ·  ソース: pallets/jinja

予想される行動

>>> from jinja2 import Template
>>> template = Template("'{{ foo }}', '{{ bar }}', '{{ baz }}'")
>>> template.render(foo='foobar', bar='barbaz', baz='bazfoo')
('foobar', 'barbaz', 'bazfoo')

実際の動作

>>> from jinja2.nativetypes import NativeEnvironment
>>> e = NativeEnvironment()
>>> t = e.from_string("'{{ foo }}', '{{ bar }}', '{{ baz }}'")
>>> t.render(foo='foobar', bar='barbaz', baz='bazfoo')
'foobar, barbaz, bazfoo'

あなたの環境

  • Pythonバージョン:2.7.5
  • Jinjaバージョン:2.10、2.10.1、現在のマスター

上記の説明を見つけようとしています。 インタプリタでこれをテストして、Jinja2だけに絞り込み、jinja2_nativeをTrueに設定したAnsibleなど、他には何も呼び出さないようにしました。

jinja2_nativeを使用しない場合、3つの置換が各値を一重引用符で囲んで発生するという上記の予想される動作が得られます。 jinja2_nativeがtrueに設定されている場合(上記のNativeEnvironmentで)、文字列内の内側の一重引用符は無視され、3つの置換で単一の文字列が返されます。

これは、一重引用符の間に追加の文字がある場合でも発生します。

>>> e = NativeEnvironment()
>>> t = e.from_string("--foo='{{ foo }}' --bar='{{ bar }}'")
>>> t.render(foo='foobar', bar='barbaz')
u"--foo='foobar --bar=barbaz'"

どんな助けでもいただければ幸いです。

最も参考になるコメント

これが(多かれ少なかれ)発生する理由について少しメモを追加するには、テンプレート"--foo='{{ foo }}' --bar='{{ bar }}'"次のノードに分割します。

  1. --foo='
  2. {{ foo }}
  3. ' --bar='
  4. {{ bar }}
  5. '"

この問題は、 native_concat 3を処理するときに発生します。 ' --bar='literal_evalは文字列を確認し、引用符を削除して、正しい--bar=だけを返します。このコンテキスト:)

@davidism何か考えはありますか?

>すべてのコメント

これが(多かれ少なかれ)発生する理由について少しメモを追加するには、テンプレート"--foo='{{ foo }}' --bar='{{ bar }}'"次のノードに分割します。

  1. --foo='
  2. {{ foo }}
  3. ' --bar='
  4. {{ bar }}
  5. '"

この問題は、 native_concat 3を処理するときに発生します。 ' --bar='literal_evalは文字列を確認し、引用符を削除して、正しい--bar=だけを返します。このコンテキスト:)

@davidism何か考えはありますか?

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