>>> 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'
Ich versuche, eine Erklärung für das oben genannte zu finden. Getestet in einem Interpreter, um es auf nur Jinja2 und nichts anderes, das es aufruft, wie Ansible mit jinja2_native auf True zu beschränken.
Wenn jinja2_native nicht verwendet wird, erhalten wir das obige erwartete Verhalten, dass die drei Ersetzungen mit einfachen Anführungszeichen um jeden Wert erfolgen. Wenn jinja2_native auf true gesetzt ist (in der NativeEnvironment wie oben gezeigt), werden die inneren einfachen Anführungszeichen in der Zeichenfolge ignoriert und eine einzelne Zeichenfolge mit den drei Ersetzungen zurückgegeben.
Dies tritt auch bei zusätzlichen Zeichen zwischen den einfachen Anführungszeichen auf:
>>> e = NativeEnvironment()
>>> t = e.from_string("--foo='{{ foo }}' --bar='{{ bar }}'")
>>> t.render(foo='foobar', bar='barbaz')
u"--foo='foobar --bar=barbaz'"
Jede Hilfe wäre dankbar.
Um noch einen kleinen Hinweis hinzuzufügen, warum dies (mehr oder weniger) passiert: Die Vorlage "--foo='{{ foo }}' --bar='{{ bar }}'"
ist in die folgenden Knoten unterteilt:
--foo='
{{ foo }}
' --bar='
{{ bar }}
'"
Das Problem tritt auf, wenn native_concat
3. verarbeitet ' --bar='
, literal_eval
ein String sieht, entfernt die Anführungszeichen und kehrt nur --bar=
, die richtig ist, nur nicht in dieser Kontext :)
@davidism irgendwelche
Hilfreichster Kommentar
Um noch einen kleinen Hinweis hinzuzufügen, warum dies (mehr oder weniger) passiert: Die Vorlage
"--foo='{{ foo }}' --bar='{{ bar }}'"
ist in die folgenden Knoten unterteilt:--foo='
{{ foo }}
' --bar='
{{ bar }}
'"
Das Problem tritt auf, wenn
native_concat
3. verarbeitet' --bar='
,literal_eval
ein String sieht, entfernt die Anführungszeichen und kehrt nur--bar=
, die richtig ist, nur nicht in dieser Kontext :)@davidism irgendwelche