हां, The Zen of Python कहता है "फ्लैट नेस्टेड से बेहतर है", हालांकि यह एकमात्र विशेषता नहीं है जिसे हम परवाह करते हैं; यह भी कहता है "सरल जटिल से बेहतर है"। with
की सुंदरता यह है कि यह वास्तव में नीचे बताए गए दोनों सिद्धांतों के का पालन करती है।
किसी भी समय जब आप पाइथन में एक विशेषता के बारे में दार्शनिक सोच में खुद को पाते हैं तो यह सुविधा के पीछे प्रेरणा के बारे में पढ़ने के लिए Python Enhancement Proposals (PEPs) को देखने लायक है। इस मामले में PEP 343 -- The "with" Statement यह कहता है कि सार में सामने:
यह पीईपी यह कोशिश/अंत में बयान के मानक का उपयोग करता है बाहर कारक संभव बनाने के लिए पायथन भाषा के लिए "के साथ" एक नया बयान कहते हैं।
try/finally
स्टेटमेंट्स फैक्टरिंग कोड को सरल और अधिक पठनीय बनाता है।
PEP 343 कुछ सरल वाक्य रचनात्मक चीनी प्रदान करने से गहरा हो जाता है।
अभिव्यक्ति तुरंत बयान में कीवर्ड के साथ निम्नलिखित एक "संदर्भ अभिव्यक्ति" के रूप में है कि अभिव्यक्ति क्रम पर्यावरण संदर्भ प्रबंधक के लिए स्थापित करता के रूप में मुख्य सुराग प्रदान करता है: यह एक संदर्भ प्रबंधक प्रोटोकॉल स्थापित करता है बयान शरीर की अवधि।
संदर्भ प्रबंधक प्रोटोकॉल का उपयोग करके, एपीआई लेखकों जटिलता को छिपाने में मदद कर सकते हैं और बहु-थ्रेडेड संदर्भ में संसाधनों का सही अधिग्रहण/रिलीज सुनिश्चित कर सकते हैं।
लेकिन with
बयान का असली सुंदरता PEP 343 का उदाहरण 12 जो बताते हैं कि में दिखाया गया है:
ए 'नेस्ट "संदर्भ प्रबंधक कि स्वचालित रूप से से आपूर्ति की संदर्भों घोंसले बाएँ-से-सही से बचने के लिए अत्यधिक इंडेंटेशन
का उपयोग nested()
संदर्भ प्रबंधक आप कोड है कि इस तरह दिखता है ले जा सकते हैं:
with a as x:
with b as y:
with c as z:
# Perform operation
और यह इस में बदल जाते हैं:
with nested(a, b, c) as (x, y, z):
# Perform operation
ध्यान दें कि nested()
अजगर 2.5 में पेश किया गया था, लेकिन संस्करण 2.7 के रूप में इसे इस एकाधिक संदर्भ प्रबंधक वाक्य रचनात्मक रूप के पक्ष में बहिष्कृत किया गया है:
with a as x, b as y, c as z:
# Perform operation
स्पष्ट रूप से न केवल यह आसान और अधिक पठनीय है, लेकिन यह घोंसला से कहीं अधिक सपाट है। है आप एक बार में एक से अधिक फ़ाइल को खोलने के लिए कई संदर्भ प्रबंधकों का उपयोग कर सकते हैं, जब आप ज़िप करना चाहते का एक उदाहरणcomments on Simeon Visser's answer यहां के जवाब में: इस प्रकार, with
का उपयोग करने का 無爲 :)
अद्यतन मार्ग का अनुसरण है दो (या अधिक) एक साथ इस तरह खोलने यदि फ़ाइलों में से एक में विफल रहता है कि यह पूरी बात असफल और ठीक से प्रत्येक फ़ाइल खोला गया था बंद कर देगा फ़ाइलों की सामग्री: दो बार
from itertools import izip
with open("/etc/passwd") as a, open("/etc/group") as b, open("/etc/shadow") as c:
for lines in izip(a,b,c):
print map(lambda x: x.split(':')[0], lines)
भागो इस उदाहरण; एक बार रूट के रूप में और एक बार सामान्य उपयोगकर्ता के रूप में। मान लें कि आप इस फ़ाइल को ziptogether.py
के रूप में सहेजते हैं, इसे पहले sudo python ziptogether.py
के साथ रूट के रूप में आमंत्रित करने का प्रयास करें और यह सफल होगा, लेकिन इसे python ziptogether.py
के साथ सामान्य उपयोगकर्ता के रूप में आमंत्रित करना विफल हो जाएगा क्योंकि आपके पास /etc/shadow
पढ़ने की अनुमति नहीं है। जब यह विफल रहता है तो संदर्भ प्रबंधक यह सुनिश्चित करेगा कि विफलता से पहले सफलतापूर्वक खोले गए फ़ाइलों को with
कथन के दायरे से बाहर चलाए जाने पर ठीक से बंद कर दिया गया है।
अधिकांश समय मैं सिर्फ आईओइरर को प्रचारित करता हूं और इसे कहीं और पकड़ता हूं। – Dikei
जितना मैं इस प्रश्न के आधार पर असहमत हूं, मुझे आपको वापस जाने और पीईपी को फिर से पढ़ने के लिए प्रस्ताव देना है [342] (http: //www.python।संगठन/देव/पेप्स/पेप -0342 /) और [343] (http://www.python.org/dev/peps/pep-0343/) – kojiro