Jinja: Jinja2 NativeEnvironment colocando comillas simples entre elementos en la plantilla para renderizar

Creado en 19 jun. 2019  ·  1Comentario  ·  Fuente: pallets/jinja

Comportamiento esperado

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

Comportamiento real

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

Tu entorno

  • Versión de Python: 2.7.5
  • Versión de Jinja: 2.10, 2.10.1, maestro actual

Tratando de encontrar una explicación de lo anterior. Probé esto en un intérprete para reducirlo a solo Jinja2, y nada más que pueda estar llamándolo, como Ansible con jinja2_native establecido en True.

Cuando no usamos jinja2_native, obtenemos el comportamiento esperado arriba de que las tres sustituciones ocurren con comillas simples alrededor de cada valor. Cuando jinja2_native se establece en verdadero (en NativeEnvironment como se muestra arriba), las comillas simples internas en la cadena se ignoran y se devuelve una sola cadena con las tres sustituciones.

Esto también ocurre incluso con caracteres adicionales entre comillas simples:

>>> e = NativeEnvironment()
>>> t = e.from_string("--foo='{{ foo }}' --bar='{{ bar }}'")
>>> t.render(foo='foobar', bar='barbaz')
u"--foo='foobar --bar=barbaz'"

Cualquier ayuda sería apreciada.

Comentario más útil

Para agregar una pequeña nota sobre por qué sucede esto (más o menos): la plantilla "--foo='{{ foo }}' --bar='{{ bar }}'" se divide en los siguientes nodos:

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

El problema ocurre cuando native_concat procesa 3. ' --bar=' , literal_eval allí ve una cadena, quita las comillas y devuelve solo --bar= que es correcto, pero no en este contexto :)

@davidism alguna idea?

>Todos los comentarios

Para agregar una pequeña nota sobre por qué sucede esto (más o menos): la plantilla "--foo='{{ foo }}' --bar='{{ bar }}'" se divide en los siguientes nodos:

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

El problema ocurre cuando native_concat procesa 3. ' --bar=' , literal_eval allí ve una cadena, quita las comillas y devuelve solo --bar= que es correcto, pero no en este contexto :)

@davidism alguna idea?

¿Fue útil esta página
0 / 5 - 0 calificaciones