2013-12-14 5 views
6

अजगर के साथ कहा जा सकता है किया जाना चाहिए कामअजगर में बयान "के साथ", क्यों "के रूप में" खंड एक वस्तु

एक होना चाहिए:

class thing(object): 
    def __enter__(self): 
     return (1,2,3) 

    def __exit__(self,a,b,c): 
     pass 

with thing() as (a,b,c): 
    print a 
    print b 
    print c 

मुझे पहले फॉर्म की अनुमति देने के साथ एक व्यावहारिक समस्या नहीं दिखाई दे रही है, इसका मतलब है कि मेरा मतलब कार्यान्वयन या तार्किक है, पार्सर को अल्पविरामों के साथ कोई समस्या नहीं होनी चाहिए (यह संदिग्ध नहीं होगा) और मुझे कोई तर्कसंगत कारण नहीं दिख रहा है।

http://docs.python.org/release/2.5/whatsnew/pep-343.html

और http://www.python.org/dev/peps/pep-0343/ पता चलता है यह सिर्फ syntatic चीनी

उत्तर

26

आप वाक्य रचना में कोष्ठक के बिना एक टपल लक्ष्य उपयोग नहीं कर सकते है, क्योंकि अन्यथा आप कई संदर्भ प्रबंधकों के बीच भेद नहीं कर सकते:

with contextmanager1 as target1, contextmanager2 as target2: 

वहां अल्पविराम देखें? चूंकि व्याकरण एकाधिक संदर्भ प्रबंधकों को निर्दिष्ट करने की अनुमति देता है, इसलिए संकलक उस फ़ॉर्म और केवल अल्पविरामों के साथ निर्दिष्ट एकाधिक लक्ष्यों के बीच अंतर नहीं कर सकता है।

आह, आप कहते हैं, लेकिन वहां as target2 भाग है, जिसका उपयोग फॉर्मों को अलग करने के लिए नहीं किया जा सकता है? फिर याद रखें, लक्ष्य वैकल्पिक है। निम्नलिखित पूरी तरह से कानूनी वाक्य रचना भी है:

with contextmanager1 as target1, contextmanager2: 

अजगर हिस्सा जानता है अल्पविराम के बाद एक और संदर्भ प्रबंधक है, क्योंकि यह कोष्टक के बिना कई लक्ष्यों के लिए अनुमति नहीं दी, सभी अस्पष्टता को दूर।

एकाधिक संदर्भ प्रबंधकों के लिए समर्थन पीईपी 343 के बाद पाइथन 2.7 और 3.1 में लागू किया गया था। हालांकि, पीईपी संभावना आशा किया:

यह प्रतिबंध एक भविष्य विस्तार वाक्य रचना के संभावित कई अल्पविराम से अलग संसाधनों वाला राज्य बन गया, अपने स्वयं के वैकल्पिक रूप-खंड के साथ प्रत्येक।

संबंधित मुद्दे