>>> 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'
上記の説明を見つけようとしています。 インタプリタでこれをテストして、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 }}'"
次のノードに分割します。
--foo='
{{ foo }}
' --bar='
{{ bar }}
'"
この問題は、 native_concat
3を処理するときに発生します。 ' --bar='
、 literal_eval
は文字列を確認し、引用符を削除して、正しい--bar=
だけを返します。このコンテキスト:)
@davidism何か考えはありますか?
最も参考になるコメント
これが(多かれ少なかれ)発生する理由について少しメモを追加するには、テンプレート
"--foo='{{ foo }}' --bar='{{ bar }}'"
次のノードに分割します。--foo='
{{ foo }}
' --bar='
{{ bar }}
'"
この問題は、
native_concat
3を処理するときに発生します。' --bar='
、literal_eval
は文字列を確認し、引用符を削除して、正しい--bar=
だけを返します。このコンテキスト:)@davidism何か考えはありますか?