2010-09-04 16 views
74

साथ बयान "के साथ" अजगर का उपयोग करते हुए इस अजगर एक कोशिश को छोड़कर ब्लॉक ?:कोशिश को छोड़कर ब्लॉक

try: 
    with open("file", "r") as f: 
     line = f.readline() 
except IOError: 
    <whatever> 

के साथ संयोजन में बयान "के साथ" का उपयोग करने के सही तरीके से अगर यह है, तो विचार कर रहा है काम करने के पुराने तरीके:

try: 
    f = open("file", "r") 
    line = f.readline() 
except IOError: 
    <whatever> 
finally: 
    f.close() 

"के साथ" बयान के प्राथमिक लाभ यहाँ है कि हम कोड की तीन लाइनों से छुटकारा पाने के कर सकते हैं? ऐसा लगता है कि इस उपयोग के मामले में मुझे इस मामले के लिए (हालांकि मैं समझता हूं कि "साथ" कथन में अन्य उपयोग हैं)।

संपादित करें: कोड के उपरोक्त दो ब्लॉक की कार्यक्षमता समान है?

EDIT2: पहले कुछ उत्तर आम तौर पर "साथ" का उपयोग करने के लाभों के बारे में बात करते हैं, लेकिन यहां पर मामूली लाभ लगता है। हम सब कुछ वर्षों से f.close() को स्पष्ट रूप से बुला रहे हैं (या होना चाहिए)। मुझे लगता है कि एक फायदा यह है कि मैला कोडर "साथ" का उपयोग करने से लाभान्वित होंगे।

+0

([बयान '' में एक अजगर का उपयोग करते समय एक अपवाद पकड़ने] की संभावित डुप्लिकेट http://stackoverflow.com/questions/713794/catching -अन-अपवाद-जबकि-उपयोग-ए-पायथन-साथ-कथन) –

उत्तर

112
  1. दो कोड ब्लॉक आप कर रहे हैं बराबर
  2. कोड आप वर्ष जिस तरह से चीजें एक गंभीर बग है ऐसा करने का के रूप में वर्णित नहीं दिया finally खंड में दूसरा अपवाद क्योंकि f बाध्य नहीं है।

बराबर पुरानी शैली कोड होगा:

try: 
    f = open("file", "r") 
    try: 
     line = f.readline() 
    finally: 
     f.close() 
except IOError: 
    <whatever> 

आप देख सकते हैं, with बयान बातें त्रुटियों की संभावना कम कर सकते हैं। पायथन (2.7, 3.1) के नए संस्करणों में, आप एक with कथन में एकाधिक अभिव्यक्तियों को भी जोड़ सकते हैं। उदाहरण के लिए:

with open("input", "r") as inp, open("output", "w") as out: 
    out.write(inp.read()) 

इसके अलावा, मैं व्यक्तिगत रूप से इसे जितनी जल्दी हो सके अपवाद को पकड़ने के लिए बुरी आदत मानता हूं। यह अपवाद का उद्देश्य नहीं है। यदि आईओ फ़ंक्शन जो असफल हो सकता है, तो अधिक जटिल ऑपरेशन का हिस्सा है, ज्यादातर मामलों में IOError को पूरे ऑपरेशन को निरस्त करना चाहिए और इसलिए बाहरी स्तर पर संभाला जाना चाहिए। with कथन का उपयोग करके, आप आंतरिक स्तर पर इन सभी try...finally कथनों से छुटकारा पा सकते हैं।

6

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

और हाँ, जिस तरह से आप with और try-except संयोजित कर दी है काफी यह करने के लिए एक ही रास्ता, के रूप में असाधारण त्रुटियों open बयान ही with ब्लॉक के भीतर पकड़ा नहीं किया जा सकता भीतर कारण होता है।

1

मुझे लगता है कि आपको "साथ" कथन के बारे में गलत लगता है कि यह केवल लाइनों को कम करता है। यह वास्तव में प्रारंभिकता और टियरडाउन को संभालता है।

आपके मामले में "के साथ"

  • एक फ़ाइल खोलने,
  • प्रक्रिया इसकी सामग्री, और
  • इसे बंद करने के लिए सुनिश्चित पड़ता है। http://effbot.org/zone/python-with-statement.htm

    संपादित करें::

यहाँ बयान "के साथ" समझने के लिए कड़ी है हाँ "के साथ" के आपके उपयोग सही है और कोड के दोनों ब्लॉकों की कार्यक्षमता समान है। "साथ" का उपयोग क्यों करें के बारे में प्रश्न? यह आपके द्वारा प्राप्त लाभों के कारण है। जैसा कि आपने गलती से f.close() खोने के बारे में बताया है। फ़ाइल खोलने के मामले में आप विफल रहता है मिल जाएगा:

-3

निम्नलिखित कोड के लिए और अधिक pythonic तरीका है:

try: 
    f = open("file", "r") 
    try: 
     line = f.readline() 
    finally: 
     f.close() 
except IOError: 
    <whatever> 

try: 
    f = open("file", "r") 
except IOError: 
    <whatever> 
else: 
    f.close() 
+0

मैंने आपके लिए कोड स्वरूपण जोड़ा है; यह पढ़ने के लिए आसान बनाता है। लेकिन आप यह सुनिश्चित करने के लिए दोबारा जांच कर सकते हैं कि मैंने इंडेंटिंग को तोड़ दिया नहीं है। – andrewsi

+0

नहीं, आपका संस्करण मूल कोड के समान काम नहीं करता है। भले ही आप लापता 'रीडलाइन()' कॉल जोड़ते हैं, भले ही आपका संस्करण 'iOError' में' readline() 'परिणाम को फ़ाइल बंद नहीं करता है। –

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