У меня есть словарь Jinja2, и я хочу отдельное выражение, которое изменяет его - или путем изменения его содержания или слияния с другим словарем.
>>> import jinja2
>>> e = jinja2.Environment()
Измените dict: Сбои.
>>> e.from_string("{{ x[4]=5 }}").render({'x':{1:2,2:3}})
Traceback (most recent call last):
File "", line 1, in
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 "", 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 "", line 1, in
File "jinja2/environment.py", line 868, in render
return self.environment.handle_exception(exc_info, True)
File "", line 1, in top-level template code
TypeError: () 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 "", line 1, in
File "jinja2/environment.py", line 868, in render
return self.environment.handle_exception(exc_info, True)
File "", line 1, in top-level template code
TypeError: call() keywords must be strings
Таким образом, как каждый изменяет словарь x
в Jinja2 путем изменения атрибута или слияния с другим словарем?
Этот вопрос подобен: Как я могу объединить два словаря Python как отдельное выражение? - поскольку Jinja2 и Python аналогичны.
Я добавил фильтр для объединения словарей, а именно:
>>> 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}'
Похоже, что расширение оператора Jinja2 «do» может помочь. Включение этого расширения позволит вам переписать:
{{ 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}'
>>>