Jinja2-复制变量而不是引用它

时间:2019-02-15 23:12:29

标签: python jinja2

我希望能够在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 :(得分:2)

$ 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())