2009-09-02 15 views
309

पाइथन कीवर्ड "साथ" के लिए क्या उपयोग किया जाता है?पाइथन कीवर्ड "साथ" के लिए क्या उपयोग किया जाता है?

उदाहरण से: http://docs.python.org/tutorial/inputoutput.html

>>> with open('/tmp/workfile', 'r') as f: 
...  read_data = f.read() 
>>> f.closed 
True 
+10

इससे मदद मिल सकती है: http://effbot.org/zone/python-with-statement.htm – Domenic

उत्तर

247

अजगर में with कीवर्ड जब (फ़ाइल धाराओं की तरह) अप्रबंधित संसाधनों के साथ काम किया जाता है। यह VB.NET और C# में using कथन के समान है। यह आपको यह सुनिश्चित करने की अनुमति देता है कि संसाधन "साफ हो जाता है" जब कोड का उपयोग करने वाले कोड को समाप्त हो जाता है, भले ही अपवाद फेंक दिए जाएं। यह try/finally ब्लॉक के लिए 'सिंटेक्टिक चीनी' प्रदान करता है।

Python Docs से:

with बयान कोड है कि पहले try...finally ब्लॉक का उपयोग सुनिश्चित करना है कि सफाई कोड निष्पादित होते हैं स्पष्ट करता है। इस खंड में, मैं कथन पर चर्चा करूंगा क्योंकि इसका आमतौर पर उपयोग किया जाएगा। अगले खंड में, मैं कार्यान्वयन विवरण की जांच करूंगा और दिखाऊंगा कि इस कथन के साथ उपयोग के लिए वस्तुओं को कैसे लिखना है।

with बयान एक नियंत्रण प्रवाह संरचना जिसका बुनियादी संरचना है:

with expression [as variable]: 
    with-block 

अभिव्यक्ति मूल्यांकन किया जाता है, और यह एक वस्तु संदर्भ प्रबंधन प्रोटोकॉल (जो है का समर्थन करता है कि में परिणाम चाहिए, __enter__() है और __exit__() विधियां)।

अद्यतन प्रति स्कॉट विस्नियुस्की की टिप्पणी वीबी कॉलआउट तय की। मैं वास्तव में using के साथ भ्रमित कर रहा था।

+4

खुले संसाधन को बंद करने के लिए किन विधियों का उपयोग किया जाता है? क्या होगा अगर मैंने अपनी खुद की फाइल सिस्टम ऑब्जेक्ट बनाई जिसकी अपनी विशेष खुली/करीबी विधियां थीं, तो "साथ" कीवर्ड उन लोगों के साथ काम करेगा? या "अंतर्निहित" केवल अंतर्निहित पायथन संसाधन प्रकारों के साथ काम करेगा? – MikeN

+9

पायथन में ऐसा लगता है कि कस्टम ऑब्जेक्ट को '__enter__' और' __exit__' विधियों को कार्यान्वित करना होगा (या जो लागू होता है) से प्राप्त होता है। आयरनपीथन के साथ (अजगर पर।नेट) आप आईडीस्पोजेबल से कार्यान्वित कर सकते हैं और इसमें इसे शामिल किया जाएगा। सुनिश्चित नहीं है कि शुद्ध पायथन या अन्य ढांचे में सबसे अच्छा तरीका क्या है। –

+1

एफवाईआई: यह वीबीएनईटी में "उपयोग" कथन को भ्रमित कर रहा है, जो कि पीबीथन में "साथ" ब्लॉक की तरह व्यवहार करता है, वीबी में "साथ" कथन के साथ जो पूरी तरह से अलग है। निम्न देखें: http://msdn.microsoft.com/en-us/library/htd05whh.aspx और http://msdn.microsoft.com/en-us/library/wc500chb(v=vs.110).aspx –

325

Explanation from the Preshing on Programming blog:

यह आप दो संबंधित संचालन जो आपको एक जोड़ी के रूप में अमल करने के लिए, के बीच में कोड का एक खंड के साथ करना चाहते हैं जब काम है। क्लासिक उदाहरण एक फ़ाइल खोल रहा है, फ़ाइल, बंद करने से छेड़छाड़ तो:

with open('output.txt', 'w') as f: 
    f.write('Hi there!') 

बयान से ऊपर स्वचालित रूप से कोड की नेस्टेड ब्लॉक के बाद फ़ाइल को बंद होगा। (यह देखने के लिए पढ़ना जारी रखें कि करीब कैसे होता है।) विवरण के साथ उपयोग करने का लाभ यह है कि यह फ़ाइल को बंद करने की गारंटी देता है इससे कोई फर्क नहीं पड़ता कि नेस्टेड ब्लॉक कैसे निकलता है। यदि ब्लॉक के अंत से पहले एक अपवाद होता है, तो यह बाहरी अपवाद हैंडलर द्वारा अपवाद पकड़े जाने से पहले फ़ाइल बंद कर देगा। यदि नेस्टेड ब्लॉक में रिटर्न स्टेटमेंट, या जारी रखना या ब्रेक स्टेटमेंट होना था, तो कथन के साथ उन मामलों में फ़ाइल भी स्वचालित रूप से बंद हो जाएगी।

+57

मैं स्वीकार्य उत्तर से यह बेहतर समझ गया। धन्यवाद। – rayryeng

+7

मुझे उदाहरणों के साथ पूर्ण स्पष्टीकरण मिला, यहां: http://preshing.com/20110920/the-python-with-statement-by-example/ – praba230890

+1

महान स्पष्टीकरण :) – jax

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