Comment puis-je modifier/fusionner Jinja2 dictionnaires?
J'ai un Jinja2 dictionnaire et je veux une expression unique qui modifie elle - soit par la modification de son contenu, ou de fusionner avec une autre dictionnaire.
>>> import jinja2
>>> e = jinja2.Environment()
Modifier un dict: Échec.
>>> 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 '='
Deux-étape de mise à jour: les Impressions superflues "None".
>>> 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)
Utilisation dict(x,**y)
: Échec.
>>> 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
Alors, comment fait-on modifier le dictionnaire x
dans Jinja2 par la modification d'un attribut ou d'une fusion avec un autre dictionnaire?
Cette question est similaire à: Comment puis-je fusionner les deux dictionnaires Python comme une seule expression? -- dans la mesure où Jinja2 et Python sont analogues.
OriginalL'auteur Brian M. Hunt | 2010-04-24
Vous devez vous connecter pour publier un commentaire.
J'ai trouvé une autre solution, sans aucune extension.
Il fait x mis à jour. N'utilisez pas de _dummy.
dict.update()
retourneNone
OriginalL'auteur yosshy
Sonne comme le Jinja2 "faire" de la déclaration de l'extension peut aider. L'activation de cette extension vous permettra de réécrire:
comme
Exemple:
{{ x.update({4:5})|default(x, true) }}
OriginalL'auteur Garrett
J'ai ajouté un filtre à fusionner les dictionnaires, à savoir:
OriginalL'auteur Brian M. Hunt