2010-04-24 19 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}) %} 

यह एक्स अपडेट करता है। _dummy का प्रयोग न करें।

+2

यह मेरे लिए स्वीकार्य उत्तर होना चाहिए ^^ –

+1

'dict.update()' रिटर्न 'कोई नहीं' – smac89

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}' 
>>> 
संबंधित मुद्दे