Jinja: Jinja2 NativeEnvironment colocando aspas simples entre os elementos no modelo para renderizar

Criado em 19 jun. 2019  ·  1Comentário  ·  Fonte: pallets/jinja

Comportamento esperado

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

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

Seu Ambiente

  • Versão Python: 2.7.5
  • Versão Jinja: 2.10, 2.10.1, mestre atual

Tentando encontrar uma explicação para o acima. Testei isso em um interpretador para restringi-lo a apenas Jinja2, e nada mais que possa estar chamando, como Ansible com jinja2_native definido como True.

Ao não usar jinja2_native, obtemos o comportamento esperado acima de que as três substituições ocorrem com aspas simples em torno de cada valor. Quando jinja2_native é definido como verdadeiro (no NativeEnvironment, conforme mostrado acima), as aspas simples internas na string são desconsideradas e uma única string é retornada com as três substituições.

Isso também ocorre mesmo com caracteres adicionais entre aspas simples:

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

Qualquer ajuda seria apreciada.

Comentários muito úteis

Para adicionar uma pequena observação sobre por que isso (mais ou menos) acontece: o modelo "--foo='{{ foo }}' --bar='{{ bar }}'" é dividido nos seguintes nós:

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

O problema acontece quando native_concat processa 3. ' --bar=' , literal_eval lá vê uma string, retira as aspas e retorna apenas --bar= que está correto, mas não em este contexto :)

@davidism algum pensamento?

>Todos os comentários

Para adicionar uma pequena observação sobre por que isso (mais ou menos) acontece: o modelo "--foo='{{ foo }}' --bar='{{ bar }}'" é dividido nos seguintes nós:

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

O problema acontece quando native_concat processa 3. ' --bar=' , literal_eval lá vê uma string, retira as aspas e retorna apenas --bar= que está correto, mas não em este contexto :)

@davidism algum pensamento?

Esta página foi útil?
0 / 5 - 0 avaliações