我希望能够在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中复制值?
答案 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())