निम्नलिखित को प्राथमिकता देने का एक कारण है:
with open('filename.txt') as fp:
for line in fp:
print line
कचरा संग्रहण के लिए सीपीथॉन की अपेक्षाकृत निर्धारक संदर्भ-गिनती योजना से हम सभी खराब हो गए हैं। अन्य, पायथन के काल्पनिक कार्यान्वयन आवश्यक रूप से withब्लॉक के बिना "जल्दी से पर्याप्त" फ़ाइल को बंद नहीं करेंगे यदि वे स्मृति को पुनः प्राप्त करने के लिए किसी अन्य योजना का उपयोग करते हैं।
इस तरह के कार्यान्वयन में, आपको ओएस से "बहुत सारी फाइलें खुली" त्रुटि मिल सकती है यदि आपका कोड कचरा संग्रहकर्ता से अनाथ फ़ाइल हैंडल पर कॉलर्स को अंतिम रूप से तेजी से फाइल खोलता है। सामान्य वर्कअराउंड जीसी को तुरंत ट्रिगर करना है, लेकिन यह एक बुरा हैक है और इसे प्रत्येक फ़ंक्शन द्वारा किया जाना चाहिए जो त्रुटि का सामना कर सकता है, जिसमें पुस्तकालय भी शामिल हैं। कितना बुरा सपना।
या आप withब्लॉक का उपयोग कर सकते हैं ।
बोनस प्रश्न
(अब पढ़ना बंद कर दें यदि केवल सवाल के उद्देश्य पहलुओं में रुचि रखते हैं।)
फ़ाइल ऑब्जेक्ट के लिए पुनरावृत्ति प्रोटोकॉल में इसे शामिल क्यों नहीं किया गया है?
यह एपीआई डिजाइन के बारे में एक व्यक्तिपरक प्रश्न है, इसलिए मेरे पास दो भागों में एक व्यक्तिपरक उत्तर है।
एक आंत स्तर पर, यह गलत लगता है, क्योंकि यह इटरेटर प्रोटोकॉल दो अलग-अलग काम करता है - लाइनों पर पुनरावृति और फ़ाइल हैंडल को बंद करना - और यह अक्सर एक साधारण दिखने वाले फ़ंक्शन को दो क्रियाएं करने के लिए एक बुरा विचार है। इस मामले में, यह विशेष रूप से बुरा लगता है क्योंकि पुनरावृत्त एक फ़ाइल की सामग्री के लिए एक अर्ध-कार्यात्मक, मूल्य-आधारित तरीके से संबंधित हैं, लेकिन फ़ाइल हैंडल का प्रबंधन एक पूरी तरह से अलग कार्य है। दोनों को स्क्वीज़ करना, अदृश्य रूप से, एक क्रिया में, उन मनुष्यों के लिए आश्चर्यजनक है जो कोड पढ़ते हैं और प्रोग्राम व्यवहार के बारे में तर्क करना अधिक कठिन बना देते हैं।
अन्य भाषाएँ अनिवार्य रूप से उसी निष्कर्ष पर पहुँची हैं। हास्केल ने तथाकथित "आलसी IO" के साथ संक्षेप में छेड़खानी की, जो आपको एक फ़ाइल पर पुनरावृत्त करने की अनुमति देता है और धारा के अंत में आने पर स्वचालित रूप से बंद हो जाता है, लेकिन यह इन दिनों हास्केल में आलसी आईओ का उपयोग करने के लिए लगभग सार्वभौमिक रूप से हतोत्साहित है, और हास्केल उपयोगकर्ता ज्यादातर कोंडिट जैसे अधिक स्पष्ट संसाधन प्रबंधन में चले गए हैं जो withपायथन में ब्लॉक की तरह अधिक व्यवहार करता है ।
तकनीकी स्तर पर, कुछ चीजें हैं जो आप पायथन में एक फ़ाइल हैंडल के साथ करना चाह सकते हैं जो कि फ़ाइल हैंडल को बंद करने पर भी काम नहीं करेगा। उदाहरण के लिए, मान लें कि मुझे फ़ाइल पर दो बार पुनरावृति करने की आवश्यकता है:
with open('filename.txt') as fp:
for line in fp:
...
fp.seek(0)
for line in fp:
...
हालांकि यह एक कम सामान्य उपयोग का मामला है, इस तथ्य पर विचार करें कि मैंने कोड की तीन पंक्तियों को एक मौजूदा कोड बेस में सबसे नीचे जोड़ा होगा, जिसमें मूल रूप से शीर्ष तीन लाइनें थीं। यदि पुनरावृति ने फ़ाइल को बंद कर दिया, तो मैं ऐसा नहीं कर पाऊंगा। तो पुनरावृत्ति और संसाधन प्रबंधन को अलग रखने से कोड के विखंडू को एक बड़े, काम कर रहे पायथन कार्यक्रम में रचना करना आसान हो जाता है।
संगतता भाषा या एपीआई की सबसे महत्वपूर्ण प्रयोज्यता सुविधाओं में से एक है।