Jinja: Jinja2 NativeEnvironment laissant tomber des guillemets simples entre les éléments du modèle pour le rendu

Créé le 19 juin 2019  ·  1Commentaire  ·  Source: pallets/jinja

Comportement prévisible

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

Comportement réel

>>> 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'

Votre environnement

  • Version Python : 2.7.5
  • Version Jinja : 2.10, 2.10.1, maître actuel

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.

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 :

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

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?

>Tous les commentaires

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 :

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

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?

Cette page vous a été utile?
0 / 5 - 0 notes