>>> 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'
Essayer de trouver une explication de ce qui précède. Testé dans un interpréteur pour le réduire à Jinja2, et rien d'autre qui puisse l'appeler, comme Ansible avec jinja2_native défini sur True.
Lorsque vous n'utilisez pas jinja2_native, nous obtenons le comportement attendu ci-dessus, à savoir que les trois substitutions se produisent avec des guillemets simples autour de chaque valeur. Lorsque jinja2_native est défini sur true (dans NativeEnvironment comme indiqué ci-dessus), les guillemets simples internes de la chaîne sont ignorés et une seule chaîne est renvoyée avec les trois substitutions.
Cela se produit également même avec des caractères supplémentaires entre les guillemets simples :
>>> e = NativeEnvironment()
>>> t = e.from_string("--foo='{{ foo }}' --bar='{{ bar }}'")
>>> t.render(foo='foobar', bar='barbaz')
u"--foo='foobar --bar=barbaz'"
Toute aide serait appréciée.
Pour ajouter une petite note sur la raison pour laquelle cela (plus ou moins) se produit : le modèle "--foo='{{ foo }}' --bar='{{ bar }}'"
est décomposé en les nœuds suivants :
--foo='
{{ foo }}
' --bar='
{{ bar }}
'"
Le problème se produit lorsque native_concat
traite 3. ' --bar='
, literal_eval
il voit une chaîne, supprime les guillemets et renvoie juste --bar=
qui est correct, mais pas dans ce contexte :)
@davidism des pensées?
Commentaire le plus utile
Pour ajouter une petite note sur la raison pour laquelle cela (plus ou moins) se produit : le modèle
"--foo='{{ foo }}' --bar='{{ bar }}'"
est décomposé en les nœuds suivants :--foo='
{{ foo }}
' --bar='
{{ bar }}
'"
Le problème se produit lorsque
native_concat
traite 3.' --bar='
,literal_eval
il voit une chaîne, supprime les guillemets et renvoie juste--bar=
qui est correct, mais pas dans ce contexte :)@davidism des pensées?