2011-03-06 18 views
17

मैं जिनजा 2 में कोड जनरेशन कर रहा हूं और मैं अक्सर दो सूचियों के माध्यम से पुनरावृत्ति करना चाहता हूं (यानी वेरिएबल्स नाम और प्रकार), क्या ऐसा करने का कोई आसान तरीका है या क्या मुझे केवल पूर्व-ज़िप सूची को पास करने की आवश्यकता है? मैं docs या गुगलिंग में ऐसा कोई फ़ंक्शन नहीं ढूंढ पाया।ज़िप (सूची 1, सूची 2)?

उत्तर

26

के बराबर है jinja2.Environment global namespace खुद को संशोधित करता है, तो आपको योग्य।

import jinja2 
env = jinja2.Environment() 
env.globals.update(zip=zip) 
# use env to load template(s) 

यह आवेदन तर्क से देखने (टेम्पलेट) तर्क को अलग करने में सहायक हो सकता है, लेकिन यह रिवर्स रूप में अच्छी तरह सक्षम बनाता है। # separationofconcerns

2

मुझे नहीं लगता कि templating भाषाएं लूप के लिए दो कंटेनर के ज़िप को करने की अनुमति देती हैं। यहां django के लिए एक समान प्रश्न है और जिंज टेम्पलेटिंग django के बहुत करीब है।

आपके पास प्रीबिल्ड ज़िप्ड कंटेनर होगा और आपके टेम्पलेट पर पास होगा।

>> for i,j in zip(range(10),range(20,30)): 
...  print i,j 
... 

>>> [(i,j) for i,j in zip(range(10),range(20,30))] 
+0

ठीक है, मुझे बहुत संदेह है। एफडब्ल्यूआईडब्ल्यू, मैंने अपनी सूचियों को एक नई कक्षा की एक सूची में जोड़कर हल किया, जो शायद वैसे भी अधिक सुरुचिपूर्ण है। –

1

चूंकि आपने इसका उल्लेख नहीं किया है कि आप फ्लास्क का उपयोग कर रहे हैं या नहीं, मुझे लगा कि मैं अपने निष्कर्ष जोड़ूंगा।

एक render_template() द्वारा इस्तेमाल किया जा करने के लिए 'जिप' फिल्टर बोतल द्वारा प्रयोग किया जाता Jinja2 वातावरण में zip() समारोह का उपयोग कर बना सकते हैं।

app = Flask(__name__) 
... 
app.jinja_env.filters['zip'] = zip 

एक टेम्पलेट के भीतर इस का उपयोग करने के इस तरह यह कार्य करें:

{% for value1, value2 in iterable1|zip(iterable2) %} 
    {{ value1 }} is paired with {{ value2 }} 
{% endfor %} 

ध्यान रखें कि तार iterable Jinja2 हैं, इसलिए यदि आप तार आप कुछ पागल सामान मिल जाएगा ज़िप करने का प्रयास करें। यह सुनिश्चित करने के लिए कि आप जो ज़िप करना चाहते हैं वह पुनरावर्तनीय है और स्ट्रिंग ऐसा नहीं करता है:

{% if iterable1 is iterable and iterable1 is not string 
    and iterable2 is iterable and iterable2 is not string %} 
    {% for value1, value2 in iterable1|zip(iterable2) %} 
     {{ value1 }} is paired with {{ value2 }} 
    {% endfor %} 
{% else %} 
    {{ iterable1 }} is paired with {{ iterable2 }} 
{% endif %} 
संबंधित मुद्दे