merge - significado - ¿Cómo puedo modificar/fusionar los diccionarios Jinja2?
jinja2 flask (3)
Tengo un diccionario Jinja2 y quiero una expresión que lo modifique, ya sea cambiando su contenido o fusionándome con otro diccionario.
>>> import jinja2
>>> e = jinja2.Environment()
Modificar un dict: fallas.
>>> 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 ''=''
Actualización de dos etapas: Imprime superfluo "Ninguno".
>>> 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)
Usar dict(x,**y)
: falla.
>>> 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
Entonces, ¿cómo se modifica el diccionario x
en Jinja2 cambiando un atributo o fusionándose con otro diccionario?
Esta pregunta es similar a: ¿Cómo puedo combinar dos diccionarios de Python como una sola expresión? - en la medida en que Jinja2 y Python son análogos.
Agregué un filtro para fusionar diccionarios, a saber:
>>> 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}''
Encontré otra solución sin ninguna extensión.
{% set _dummy = x.update({4:5}) %}
Hace x actualizado. No uses _dummy.
Suena como la extensión de declaración "do" de Jinja2 puede ayudar. Habilitar esta extensión le permitiría volver a escribir:
{{ x.update({4:5}) }} {{ x }}
como
{% do x.update({4:5}) %} {{ x }}
Ejemplo:
>>> 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}''
>>>