2011-08-18 14 views
20
में छोड़कर

सबसे पहले, मुझे नहीं पता कि मेरा दृष्टिकोण उचित है हूँ, इसलिए मैं सुझाव की एक किस्म के लिए खुला रहा हूँ।बार-बार दोहराया ट्राई/अजगर

तो कोशिश/छोड़कर बयान अक्सर कोड में दोहराया जाता है, तो उन्हें छोटा या पूरी तरह से उन्हें बाहर लेखन से बचने के लिए किसी भी अच्छे तरीके हैं?

try: 
    # Do similar thing 
    os.remove('/my/file') 
except OSError, e: 
    # Same exception handing 
    pass 

try: 
    # Do similar thing 
    os.chmod('/other/file', 0700) 
except OSError, e: 
    #Same exception handling 
    pass 

उदाहरण के लिए, एक पंक्ति कार्यों के लिए आप एक अपवाद हैंडलिंग आवरण निर्धारित कर सकते हैं और फिर एक लैम्ब्डा समारोह पारित:

def may_exist(func): 
    "Work with file which you are not sure if exists.""" 
    try: 
     func() 
    except OSError, e: 
     # Same exception handling 
     pass 

may_exist(lambda: os.remove('/my/file')) 
may_exist(lambda: os.chmod('/other/file', 0700)) 

इस 'समाधान' सिर्फ बातें कम स्पष्ट कर देता है? क्या मुझे बस सभी प्रयासों को छोड़कर/बयान छोड़कर पूरी तरह लिखना चाहिए?

+0

[अजगर?: कोशिश छोड़कर अभिव्यक्ति के रूप में] के संभावित डुप्लिकेट (http://stackoverflow.com/questions/7088009/python-try-except-as -न-अभिव्यक्ति) – agf

+0

मी और @kindall ने कल इस सवाल का जवाब बहुत अच्छी तरह से दिया। – agf

+0

@agf: वह प्रश्न आंशिक रूप से संबंधित लगता है, लिंक करने के लिए धन्यवाद। हालांकि नेड बचेचेल्डर के जवाब का लाभ यह है कि कोड के ब्लॉक से कोई फ़ंक्शन बनाने की आवश्यकता नहीं है जिसके लिए अपवादों को पकड़ा जाना आवश्यक है। – sutre

उत्तर

24

की तरह समारोह और तर्क गुजर अनुशंसा है एक संदर्भ प्रबंधक के साथ है लाभ यह है कि आप प्रत्येक सामान्य_handling ब्लॉक में, पूर्ण बयान, और उनमें से एक से अधिक डाल सकते हैं।

ध्यान रखें, हालांकि, फिर पर एक ही निपटने उपयोग करने के लिए अपनी जरूरत से अधिक-से निपटने अपवाद की तरह एक बहुत लगता है। क्या आपको यकीन है कि आपको यह करने की ज़रूरत है?

+0

मुझे लगता है कि यह वही है जो मैं खोज रहा था, लेकिन मैं ओवर-हैंडलिंग अपवाद हो सकता हूं। इन मामलों में मैं केवल तभी फाइलों के साथ काम करना चाहता हूं जब वे मौजूद हों। मैं जांच सकता हूं कि क्या वे पहले से मौजूद हैं (os.path.filexists), लेकिन जो मैं समझता हूं उससे, पाइथन में अपवादों को आजमाने और पकड़ने के लिए बेहतर है? – sutre

+0

उस मामले में, यह मतलब हो सकता है शेष संचालन से * पहले * अपवाद को पकड़ने के लिए, और फिर उस फ़ाइल के बारे में अगर यह मौजूद नहीं था बयानों के पूरे ब्लॉक छोड़, लेकिन जाने सभी अन्य अपवाद का प्रचार है, यह है, क्योंकि संभावना है कि दूसरे में अपवाद के बाद पहले अपवाद की कमी फ़ाइल अस्तित्व के बराबर है। – SingleNegationElimination

+0

@TokenMacGuy: धन्यवाद, यह बहुत समझ में आता है। मैं देखूँगा कि ऐसा करने का सबसे अच्छा तरीका क्या है। – sutre

2

मुझे लगता है कि अपने सामान्य समाधान ठीक है, लेकिन मैं तल पर उन lambdas का उपयोग नहीं होता।

from contextlib import contextmanager 
@contextmanager 
def common_handling(): 
    try: 
     yield 
    finally: 
     # whatever your common handling is 

तो:

with common_handling(): 
    os.remove('/my/file') 

with common_handling(): 
    os.chmod('/other/file', 0700) 

यह है मैं सार अपवाद संचालन करने के लिए सबसे अच्छा तरीका यह

def may_exist(func, *args): 
    "Work with file which you are not sure if exists.""" 
    try: 
     func(args) 
    except OSError, e: 
     # Same exception handling 
     pass 

may_exist(os.remove, '/my/file') 
may_exist(os.chmod, '/other/file', '0700') 
4

यह शायद may_exist एक डेकोरेटर बनाने के लिए क्लीनर होगा:

from functools import wraps 
def may_exist(func): 
    @wraps(func): 
    def wrapper(*args, **kwds): 
     try: 
      return func(*args, **kwds) 
     except OSError: 
      pass 
    return wrapper 

तो आप कर सकते हैं या तो कार्य करें:

may_exist(os.remove)('/my/file') 
may_exist(os.chmod)('/other/file', 0700) 
एक बंद कॉल के लिए

, या:

remove_if_exists = may_exist(os.remove) 
... 
remove_if_exists('somefile') 

यदि आप इसका बहुत उपयोग करते हैं।

1
इस काम की तरह

चाहेंगे कुछ:

def may_exist(func, *func_args): 
    try: 
     func(*func_args) 
    except OSError as e: 
     pass 
संबंधित मुद्दे