2010-09-15 14 views
9

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

उत्तर

20

एक अच्छा दिशानिर्देश assert उपयोग कर रहा है, जब इसके ट्रिगर अपने कोड में एक बग का मतलब है। जब आपका कोड कुछ मानता है और धारणा पर कार्य करता है, तो इस धारणा को assert के साथ सुरक्षित रखने की अनुशंसा की जाती है। यह assert असफल होने का मतलब है कि आपकी धारणा सही नहीं है, जिसका अर्थ है कि आपका कोड सही नहीं है।

3

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

3

एक अच्छा उदाहरण स्थिरता के लिए एक समारोह के तर्कों जाँच कर रहा है:

def f(probability_vector, positive_number): 
    assert sum(probability_vector) == 1., "probability vectors have to sum to 1" 
    assert positive_number >= 0., "positive_number should be positive" 
    # body of function goes here 
+1

दिलचस्प - मुझे नहीं पता था कि '0.'' 0.0' के लिए शॉर्टेंड था। प्रतिकृति कहती है कि यह हालांकि है। मैं इसे वास्तविक कोड में उपयोग नहीं कर सकता हूं क्योंकि यह अत्यधिक "चालाक" लगता है और आसानी से याद किया जाता है। एक टाइपो के रूप में समझा जा सकता है, लेकिन 0.0 हमेशा एक फ्लोट का मतलब समझा जाता है। – Daenyth

+0

यह ऐसी परिस्थिति के समान लगता है जहां मेरे पास एक ऐसा फ़ंक्शन था जो 2 डी मैट्रिक्स से तत्व प्राप्त कर रहा था। यह जोर देने के लिए समझ में आया कि पंक्ति और कॉलम इनपुट वास्तव में मैट्रिक्स की सीमाओं में थे। लेकिन बाद में मैं कुछ कर रहा था जहां मैंने एक तत्व लिया और आसन्न तत्वों के साथ कुछ करना चाहता था। एक बार जब मैंने इसे कोडिंग करना शुरू किया, तो तत्व के किनारे पर होने पर मुझे विशेष मामले होने पड़ते थे, क्योंकि आसन्न तत्व मैट्रिक्स के बाहर थे। इसके बजाय अपवादों का उपयोग करना बेहतर लग रहा था। – Colin

+0

अपवादों को कोड को संशोधित करना आसान कैसे होगा? जब आप फ़ंक्शन के व्यवहार को बदलते हैं, तो आपको अभी भी अपवाद बढ़ाने वाले भाग को संशोधित करना होगा, है ना? – pberkes

15

ऐसी चीजों की जांच करने के लिए जोर देने का उपयोग करते हैं जो कभी नहीं होना चाहिए। एक सैनिटी चेक की तरह।

एक और बात को एहसास है कि asserts जब अनुकूलित हटा दिया जाता है: जब अनुकूलन संकलन समय पर अनुरोध किया जाता है

वर्तमान कोड जनरेटर एक ज़ोर बयान के लिए कोई कोड उत्सर्जन करता है।

+4

+1 यह इंगित करने के लिए कि यदि आप पाइथन को '-O' ध्वज के साथ आमंत्रित करते हैं तो उस आवेषण को हटा दिया जाता है।मुद्दा यह है कि यदि आप * अगर आप आवेषण लेते हैं तो आपका कोड अलग-अलग व्यवहार करने की अपेक्षा करता है तो आप उनका दुरुपयोग कर रहे हैं - वे केवल डीबगिंग के लिए हैं। –

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