tutorial significado sheet jinja cheat merge dictionary jinja2

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}'' >>>