2009-05-02 31 views
10

क्या में के रूप में अजगर में पहुंच योग्य नहीं कोड को नामित करने pythonic तरीका है नामित करने के लिए:कैसे पहुँच योग्य नहीं अजगर कोड

gender = readFromDB(...) # either 'm' or 'f' 
if gender == 'm': 
    greeting = 'Mr.' 
elif gender == 'f': 
    greeting = 'Ms.' 
else: 
    # What should this line say? 
+5

शायद इसे "पैट" कहना चाहिए? –

+0

मुझे नहीं लगता कि पहुंचने योग्य कोड इसके लिए सही शब्द है। Http://en.wikipedia.org/wiki/Unreachable_code – Unknown

+0

@ अज्ञात देखें इसके बजाय आप क्या सुझाव देंगे? मुझे पता है कि यह उदाहरण अच्छा नहीं है, क्योंकि अन्य लूप वास्तव में पहुंच योग्य है। लेकिन जैसा भी होता है, यह बिल्कुल "पहुंचने योग्यता का उपाय" है जिसे मैं ढूंढ रहा हूं। – phihag

उत्तर

24
raise ValueError('invalid gender %r' % gender) 
+1

पायथनिक घोषणापत्र से ... "... त्रुटियों को कभी चुपचाप गुजरना नहीं चाहिए। जब तक स्पष्ट रूप से चुप नहीं किया जाता।" – jottos

7

यह कैसे सुनिश्चित करें कि आप लिंग होने का कर रहे हैं पर निर्भर करता है या तो 'm' या 'f'

यदि आप बिल्कुल निश्चित हैं, तो if...elif...else के बजाय if...else का उपयोग करें। बस हर किसी के लिए यह आसान बनाता है।

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

+0

/आप किस/अपवाद प्रकार का सुझाव देंगे? और उदाहरण के लिए हर कोई पकड़ा जाता है;)। – phihag

+1

शायद 'ValueError' जैसा कि दूसरों द्वारा सुझाया गया है। ऐसा लगता है कि यह सबसे अधिक समझ में आता है: http://docs.python.org/library/exceptions.html – zenazn

+1

* हमेशा * विकृत डेटा के लिए एक मौका है। –

7

आप एक अपवाद बढ़ा सकता है:

raise ValueError("Unexpected gender; expected 'm' or 'f', got %s" % gender) 

या एक ज़ोर झूठी उपयोग करें यदि आप डेटाबेस केवल 'पु' या 'म' वापसी की उम्मीद:

assert False, "Unexpected gender; expected 'm' or 'f', got %s" % gender 
+1

मुझे लगता है कि आपका मतलब है 'झूठा झुकाव' :) – Stephan202

+0

मेह, निश्चित धन्यवाद :) – marcog

4

मैं वास्तव में लगता है कि यह है कि इसके लिए एक जगह।

class SeriousDesignError(Exception): 
    pass 

तो आप इस

if number % 2 == 0: 
    result = "Even" 
elif number % 2 == 1: 
    result = "Odd" 
else: 
    raise SeriousDesignError() 

मुझे लगता है यह सबसे सार्थक त्रुटि संदेश है कर सकते हैं। बात इस तरह की केवल डिजाइन त्रुटियों के माध्यम से पैदा कर सकते हैं (या बुरा रखरखाव, जो एक ही बात है।)

+1

मैं एसडीई को बढ़ाने के दौरान एक वर्णनात्मक स्ट्रिंग भी शामिल करूंगा, जैसे 'गंभीर डिज़ाइन त्रुटि (' संख्याएं या तो अजीब होनी चाहिए ')' – gomad

2

मैं कभी कभी करते हैं:

if gender == 'm': 
    greeting = 'Mr.' 
else: 
    assert gender == 'f' 
    greeting = 'Ms.' 

मैं इस का पाठक बताने का एक अच्छा काम करता है लगता है कोड है कि केवल (इस मामले में) दो संभावनाएं हैं, और वे क्या हैं। यद्यपि आप AssertionError की तुलना में अधिक वर्णनात्मक त्रुटि उठाने का मामला बना सकते हैं।

4

यह बिल्कुल निर्भर करता है कि आप क्या त्रुटि संकेत करने के लिए चाहते हैं, लेकिन मैं इस मामले में एक शब्दकोश का प्रयोग करेंगे:

greetings={'m':'Mr.', 'f':'Ms.'} 
gender = readFromDB(...) # either 'm' or 'f' 
greeting=greetings[gender] 

तो लिंग न मीटर है और न ही च है, यह एक KeyError अप्रत्याशित मूल्य युक्त बढ़ा देंगे:

greetings={'m':'Mr.', 'f':'Ms.'} 

>>> greetings['W'] 

Traceback (most recent call last): 
    File "<pyshell#4>", line 1, in <module> 
    greetings['W'] 
KeyError: 'W' 

आप संदेश में और अधिक विस्तार चाहते हैं, आप इसे reraise & पकड़ कर सकते हैं:

try: 
    greeting = greetings[gender] 
except KeyError,e: 
    raise ValueError('Unrecognized gender %s'%gender) 
3

अब तक, मैं आमतौर पर जॉन फ़ूही के जवाब पर एक परिवर्तन का उपयोग किया है - लेकिन इस बिल्कुल सही रूप में एतान बताते हैं नहीं है,: हर कोई आपकी चलाता

assert gender in ('m', 'f') 
if gender == 'm': 
    greeting = 'Mr.' 
else: 
    greeting = 'Ms.' 

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

def check(condition, msg=None): 
    if not condition: 
     raise ValueError(msg or '') 

check(gender in ('m', 'f')) 
if gender == 'm': 
    greeting = 'Mr.' 
else: 
    greeting = 'Ms.' 

वापस मूल प्रश्न के लिए जा रहे हैं, मैं दावा करता हूँ कि एक का उपयोग कर जोर() या जाँच() करने से पहले यदि/किसी और तर्क पढ़ने में आसान, सुरक्षित, और अधिक स्पष्ट है:

  • यह पहली बार उस पर कार्रवाई करने के लिए शुरू करने से पहले डेटा की गुणवत्ता का परीक्षण करती है - यह अगर महत्वपूर्ण हो सकता है अगर/अन्य चेन
  • में '==' के अलावा ऑपरेटर हैं, तो यह उन्हें पूछताछ के बजाय, शाखाकरण तर्क से दावा परीक्षण को अलग करता है - वें
+0

यदि आप चाहें पूर्व-सत्यापित करने के लिए आपको यह करना चाहिए कि अगर लिंग में नहीं है ('एम', 'एफ'): कुछ अपवाद को बढ़ाएं क्योंकि 'जोर' को अनुकूलित किया जा सकता है और फिर आपके पास कोई सत्यापन नहीं है। –

+0

Arg। ये सही है। मैं कभी भी ओओ-ओओ का उपयोग नहीं करता इसलिए मैं अपने कोड के लिए इसके बारे में चिंता नहीं करता, लेकिन मैं मानता हूं कि यह एक बुरी आदत है। मैं जवाब ठीक कर दूंगा। – stevegt

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