2016-01-02 2 views
13

के साथ try/except के बजाय अपवाद को दबाने के लिए contextlib.suppress का उपयोग क्यों करेगा?क्यों संदर्भ के साथ/छोड़ने के विपरीत contextlib.suppress का उपयोग करें?

इन दो तरीकों के बीच वर्ण की राशि में कोई अंतर नहीं (अगर कुछ भी, suppress अधिक कैरेक्टर हैं), और भले ही कोड अक्सर अक्षरों के स्थान पर एलओसी में गिना जाता है, suppress भी try तुलना में बहुत धीमी हो रहा है है/दोनों ही मामलों में except एक त्रुटि उठाया जब जाता है और जब यह नहीं है:

Python 3.5.0 (v3.5.0:374f501f4567, Sep 13 2015, 02:27:37) [MSC v.1900 64 bit (AMD64)] on win32 
Type "copyright", "credits" or "license()" for more information. 
>>> from timeit import timeit 
>>> # With an error 
>>> timeit("""with suppress(ValueError): 
    x = int('a')""", setup="from contextlib import suppress") 
1.9571568971892543 
>>> timeit("""try: 
    x = int('a') 
except ValueError: 
    pass""") 
1.0758466499161656 
>>> # With no error 
>>> timeit("""with suppress(ValueError): 
    x = int(3)""", setup="from contextlib import suppress") 
0.7513525708063895 
>>> timeit("""try: 
    x = int(3) 
except ValueError: 
    pass""") 
0.10141028937128027 
>>> 
+1

यह दो लाइनों को बचाता है। यदि आपके पास –

+0

जैसे कई लगातार ब्लॉक हैं, तो यह पठनीयता में बहुत सुधार करता है, इसी प्रकार, जब आप लूप का उपयोग कर सकते हैं तो 'any() 'या' all() 'का उपयोग क्यों करें? मुझे लगता है कि 'contextlib.suppress' का उपयोग करके पठनीयता और रख-रखाव में मदद मिलती है। –

+2

@ सिमोनविसर 'कोई भी() 'और' सभी() '* स्पष्ट रूप से * लाइन को बुद्धिमान और चरित्र के अनुसार कोड को छोटा बना देता है। मुझे भी यकीन है कि 'किसी भी() 'और' सभी() '' लूप' की तुलना में प्रदर्शन के अनुसार तेज हैं। जहां तक ​​मैं देख सकता हूं, 'दबाने' का उपयोग करने का एकमात्र कारण यह है कि यह थोड़ा और पठनीय है (और यह अविश्वसनीय है क्योंकि यह अधिक वर्ण लेता है)। 'कोशिश/छोड़कर' का उपयोग करना * दूसरी तरफ * तेज * तेज है। –

उत्तर

6

पठनीयता को त्याग किए बिना यह दो पंक्तियों का कम कोड है।

यह नेस्टेड या लगातार कोड ब्लॉक के लिए विशेष रूप से सुविधाजनक हो सकता है। की तुलना करें:

try: 
    a() 
    try: 
     b() 
    except B: 
     pass 
except A: 
    pass 

बनाम .:

with suppress(A): 
    a() 
    with suppress(B): 
     b() 

यह भी मंशा व्यक्त करने के लिए अनुमति देता है: अगर यह कुछ करते हुए उठाया है

  • with suppress(SpecificError): do_something() कहते त्रुटि का प्रचार नहीं करते
  • try: do_something() except SpecificError: pass कहते हैं कुछ करें और प्रचार न करें ई त्रुटि अगर इसे उठाया गया है

यह कम महत्वपूर्ण है क्योंकि अधिकांश लोग अंतर नहीं देखेंगे।

1

वैचारिक रूप से, मेरे लिए, contextlib.suppress दृष्टिकोण मुझे त्रुटियों (जैसे कि एक फ़ाइल को निकालने का प्रयास के रूप में है कि होने की संभावना है संभाल करने के लिए अनुमति देता है वह वास्तव में वहां नहीं हो सकता है)। कोशिश करें/छोड़कर 'यह नहीं होना चाहिए' घटनाओं की एक अधिक सक्रिय हैंडलिंग बन जाती है (जैसे 0 से विभाजित या कुछ खोलने में असमर्थता जिसे मैं लिखना चाहता हूं)।

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