Jinja: Jinja2 NativeEnvironment löscht einfache Anführungszeichen zwischen Elementen in der Vorlage zum Rendern

Erstellt am 19. Juni 2019  ·  1Kommentar  ·  Quelle: pallets/jinja

Erwartetes Verhalten

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

Tatsächliches Verhalten

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

Ihre Umgebung

  • Python-Version: 2.7.5
  • Jinja-Version: 2.10, 2.10.1, aktueller Meister

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.

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:

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

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

>Alle Kommentare

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:

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

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

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen