2010-04-24 47 views
12

我有一個Jinja2字典,我想要一個單一的表達式來修改它 - 或者通過改變它的內容,或者與另一個字典合併。如何修改/合併Jinja2字典?

>>> import jinja2 
>>> e = jinja2.Environment() 

修改字典:失敗。

>>> e.from_string("{{ x[4]=5 }}").render({'x':{1:2,2:3}}) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "jinja2/environment.py", line 743, in from_string 
    return cls.from_code(self, self.compile(source), globals, None) 
    File "jinja2/environment.py", line 469, in compile 
    self.handle_exception(exc_info, source_hint=source) 
    File "<unknown>", line 1, in template 
jinja2.exceptions.TemplateSyntaxError: expected token 
              'end of print statement', got '=' 

兩階段更新:打印多餘的「無」。

>>> e.from_string("{{ x.update({4:5}) }} {{ x }}").render({'x':{1:2,2:3}}) 
u'None {1: 2, 2: 3, 4: 5}' 
>>> e.from_string("{{ dict(x.items()+ {3:4}.items()) }}").render({'x':{1:2,2:3}}) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "jinja2/environment.py", line 868, in render 
    return self.environment.handle_exception(exc_info, True) 
    File "<template>", line 1, in top-level template code 
TypeError: <lambda>() takes exactly 0 arguments (1 given) 

使用dict(x,**y):失敗。

>>> e.from_string("{{ dict((3,4), **x) }}").render({'x':{1:2,2:3}}) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "jinja2/environment.py", line 868, in render 
    return self.environment.handle_exception(exc_info, True) 
    File "<template>", line 1, in top-level template code 
TypeError: call() keywords must be strings 

那麼,如何修改的Jinja2字典x通過改變屬性或與其他詞典合併?

這個問題類似於:How can I merge two Python dictionaries as a single expression?-就Jinja2和Python是類似的。

回答

18

我發現沒有任何擴展的另一解決方案。

{% set _dummy = x.update({4:5}) %} 

它使x更新。不要使用_dummy。

+2

這應該是我接受的答案^^ – 2016-08-28 15:54:59

+1

'dict.update()'returns'None' – smac89 2017-08-21 22:13:22

2

我添加了一個過濾器合併字典,即:

>>> def add_to_dict(x,y): return dict(x, **y) 
>>> e.filters['add_to_dict'] = add_to_dict 
>>> e.from_string("{{ x|add_to_dict({4:5}) }}").render({'x':{1:2,2:3}}) 
u'{1: 2, 2: 3, 4: 5}' 
18

聽起來就像是Jinja2 "do" statement extension可能會有幫助。啓用此擴展將允許你改寫:

"{{ x.update({4:5}) }} {{ x }}"

"{% do x.update({4:5}) %} {{ x }}"

實施例:

>>> import jinja2 
>>> e = jinja2.Environment(extensions=["jinja2.ext.do",]) 
>>> e.from_string("{% do x.update({4:5}) %} {{ x }}").render({'x':{1:2,2:3}}) 
u' {1: 2, 2: 3, 4: 5}' 
>>>