Jinja2 - копировать переменную вместо ссылки на нее - PullRequest
0 голосов
/ 16 февраля 2019

Я бы хотел иметь возможность скопировать переменную в Jinja2 (2.10) вместо того, чтобы просто ссылаться на нее, но не мог найти способ сделать это.

См. Следующий пример:

from jinja2 import Environment
from jinja2.ext import do
env = Environment(extensions=[do])
template = env.from_string('''
  {%- set base = {"elems": {"a": "aa"}} -%}
  {%- set data = {"elems": base.elems} -%}
  {%- do data.elems.update({"a": "bb"}) -%}
  {{ base.elems.a }} - "aa" expected
  {{ data.elems.a }} - "bb" expected
''')
template.render()

Результат: 'bb - "aa" expected\nbb - "bb" expected'

Таким образом, это означает, что data.elems не является копией base.elems, а является ссылкой на нее.Мне нужно иметь копию base.elems в data.elems.

Я пытался:

  • base.get('elems')
  • base|attr('elems')

Но ни один из них не работал.Есть ли способ скопировать значения в Jinja2?

1 Ответ

0 голосов
/ 16 февраля 2019
$ python q54718238.py
aa - "aa" expected
  bb - "bb" expected

Хитрость заключается в том, что многие типы данных Python являются ссылочными.Таким образом, вызов copy() для объекта исправляет это.Обратите внимание, что я изменил {%- set data = {"elems": base.elems} -%} на {%- set data = {"elems": base.elems.copy()} -%}.

from jinja2 import Environment
from jinja2.ext import do
env = Environment(extensions=[do])
template = env.from_string('''
  {%- set base = {"elems": {"a": "aa"}} -%}
  {%- set data = {"elems": base.elems.copy()} -%}
  {%- do data.elems.update({"a": "bb"}) -%}
  {{ base.elems.a }} - "aa" expected
  {{ data.elems.a }} - "bb" expected
''')
print(template.render())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...