2010-08-16 10 views
5

मुझे यकीन है कि यह अवधारणा पहले आई है लेकिन मुझे एक अच्छा, सरल जवाब नहीं मिल रहा है। कई रिटर्न के साथ कार्यों को संभालने के लिए कोशिश/आखिरकार एक बुरा तरीका उपयोग कर रहा है? उदाहरण के लिए मैंपाइथन कोशिश/प्रवाह नियंत्रण के लिए अंत में

 

try: 
    if x: 
     return update(1) 
    else: 
     return update(2) 
finally: 
    notifyUpdated() 
 

है यह सिर्फ अद्यतन भंडारण की तुलना में अच्छे() लगता है एक अस्थायी चर में और कहा कि लौटने आदेश देता है।

उत्तर

11

मैं यह सिफारिश नहीं होता कर सकते हैं। सबसे पहले क्योंकि notifyUpdated() को तब भी बुलाया जाएगा जब किसी भी शाखा में कोड अपवाद फेंकता है। ,

try: 
    if x: 
     return update(1) 
    else: 
     return update(2) 
except: 
    raise 
else: 
    notifyUpdated() 

दूसरे क्योंकि try ब्लॉक आम तौर पर दर्शाते हैं कि आप अपवाद संचालन किसी तरह कर रहे हैं, और आप नहीं, तो आप सिर्फ उनके लिए उपयोग कर रहे हैं: आप वास्तव में अभिप्रेत व्यवहार पाने के लिए कुछ इस तरह की आवश्यकता होगी सुविधा। तो यह निर्माण लोगों को भ्रमित करेगा।

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

+0

पर क्लीनअप सुनिश्चित करने का एक कानूनी तरीका है इसके बारे में अच्छा बिंदु इतना भ्रमित है कि पहले दो उत्तरों ने निशान को याद किया। –

0
http://docs.python.org/library/contextlib.html से

:


from contextlib import closing 
import urllib 

with closing(urllib.urlopen('http://www.python.org')) as page: 
    for line in page: 
     print line 

ताकि आप एक समान कार्य बनाने और उपयोग यह

+0

एक बेहतर विचार वास्तव में ऑप्स प्रश्न को हल नहीं करता है। – Omnifarious

+0

'with' stmt – amwinter

3

मुझे लगता है कि तुम्हारा मतलब तुम कोशिश/अंत में इस के लिए एक विकल्प के रूप में उपयोग करना चाहते हैं:

if x: 
    result = update(1) 
else: 
    result = update(2) 
notifyUpdated() 
return result 

मुझे लगता है कि इस शैली की बात है। मेरे लिए असाधारण सशर्त संभालने के लिए try आरक्षित करना पसंद है। मैं इसे प्रवाह नियंत्रण कथन के रूप में उपयोग नहीं करूंगा।

+0

जबकि मुझे लगता है कि यह शैली का मामला है, मुझे नहीं लगता कि इसका मतलब है कि प्रश्न में हाँ या कोई जवाब नहीं है। आपके द्वारा बताए गए कारणों के लिए मैं निश्चित रूप से 'नहीं' कहूंगा और क्योंकि यह अधिक भ्रमित है। – Omnifarious

+0

मैं सहमत हूं। मुझे एक मजबूत रुख लेना चाहिए। –

11

मैं प्रवाह के लिए प्रयास/आखिरकार उपयोग नहीं करता जिसमें अपवाद शामिल नहीं होते हैं। यह अपने स्वयं के लिए बहुत मुश्किल है।

यह बेहतर है:

if x: 
    ret = update(1) 
else: 
    ret = update(2) 
notifyUpdated() 
return ret 
3

मुझे लगता है कि इस परेशानी के लिए पूछ रहा है। बाद में क्या होता है, जब आप अपना कोड निम्नलिखित में बदलते हैं?

try: 
    if x: 
     return update(1) 
    elif y: 
     return update(2) 
    else: 
     return noUpdateHere() 
finally: 
    notifyUpdated() # even if noUpdateHere()! 

पर सबसे अच्छा, यह आपके कोड के सबसे पाठकों के लिए एक बड़ी बात (शायद आप भी छह महीने में), क्योंकि यह एक उद्देश्य है कि सामान्य उपयोग के पैटर्न से अलग है के लिए try/finally का उपयोग कर रहा है। और जिस टाइपिंग को बचाता है वह वैसे भी कम है।

+0

मुझे उस ठोकर बिंदु से चूक गया। यह मामला मूल रूप से छिपे हुए रूप में पहले से मौजूद है, हालांकि अगर 'अपडेट (1) 'या' अपडेट (2) 'एक अपवाद फेंक देता है जिसका अर्थ है कि' अधिसूचित अद्यतन()' नहीं कहा जाना चाहिए। – Omnifarious

3

मुझे लगता है कि एक डेकोरेटर यहाँ

def notifyupdateddecorator(f): 
    def inner(*args, **kw): 
     retval = f(*args, **kw) 
     notifyUpdated() 
     return retval 
    return inner 

@notifyupdateddecorator 
def f(x): 
    if x: 
     return update(1) 
    else: 
     return update(2) 

@notifyupdateddecorator 
def g(x): 
    return update(1 if x else 2) 
+0

हम्म, मैंने इसे कस्टम सजावट के बारे में कभी नहीं देखा है। क्या आपके पास एक लिंक है जहां इसका वर्णन किया गया है? – Falmarri

+0

@ फाल्मररी, http://docs.python.org/glossary.html#term-decorator –

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