जवाबों:
assert
बयान लगभग हर प्रोग्रामिंग भाषा में मौजूद है। यह आपके प्रोग्राम में शुरुआती समस्याओं का पता लगाने में मदद करता है, जहां कारण स्पष्ट है, बजाय बाद में कुछ अन्य ऑपरेशन के साइड-इफेक्ट के रूप में।
जब तुम करोगे...
assert condition
... आप प्रोग्राम को उस स्थिति का परीक्षण करने के लिए कह रहे हैं, और यदि स्थिति झूठी है तो तुरंत एक त्रुटि ट्रिगर करें।
पायथन में, यह लगभग इसके बराबर है:
if not condition:
raise AssertionError()
इसे पायथन शेल में आज़माएं:
>>> assert True # nothing happens
>>> assert False
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AssertionError
निबंध में एक वैकल्पिक संदेश शामिल हो सकता है, और दुभाषिया चलाते समय आप उन्हें अक्षम कर सकते हैं।
यदि संदेश विफल हो जाता है तो संदेश प्रिंट करना:
assert False, "Oh no! This assertion failed!"
करो नहीं कोष्ठक का उपयोग कॉल करने के लिए assert
एक समारोह की तरह। यह एक बयान है। यदि आप करते हैं तो assert(condition, message)
आप पहले पैरामीटर के रूप में assert
एक (condition, message)
टपल के साथ चल रहे होंगे ।
उन्हें अक्षम करने के लिए, जब python
अनुकूलित मोड में चल रहा है, जहां __debug__
है False
, मुखर बयानों को नजरअंदाज कर दिया जाएगा। बस -O
ध्वज को पास करें :
python -O script.py
प्रासंगिक दस्तावेज के लिए यहां देखें ।
if not condition: raise AssertError()
, तो मुझे मुखर का उपयोग क्यों करना चाहिए? क्या कोई ऐसी स्थिति है जिसके तहत मुखर केवल if not condition
बयान के एक छोटे रूप के अलावा बेहतर है ?
if
)। अधिक जानकारी के लिए डॉक्स पढें :)
assert
, लेकिन सभी उत्तरों को पढ़ने के बाद, मुझे पूरी तरह से कुछ भी नहीं चाहिए!
कोष्ठक के लिए बाहर देखो। जैसा कि ऊपर बताया गया है, पायथन 3 में, assert
अभी भी एक बयान है , इसलिए सादृश्य के साथ print(..)
, कोई भी इसे करने के लिए assert(..)
या raise(..)
आपको नहीं करना चाहिए।
यह महत्वपूर्ण है क्योंकि:
assert(2 + 2 == 5, "Houston we've got a problem")
इसके विपरीत काम नहीं करेगा
assert 2 + 2 == 5, "Houston we've got a problem"
पहला काम नहीं करने का कारण यह है कि इसका bool( (False, "Houston we've got a problem") )
मूल्यांकन किया जाए True
।
बयान में assert(False)
, ये केवल निरर्थक कोष्ठक हैं False
, जो उनकी सामग्री का मूल्यांकन करते हैं। लेकिन assert(False,)
कोष्ठक के साथ अब एक टपल है, और एक गैर-खाली ट्यूल का True
बूलियन संदर्भ में मूल्यांकन किया जाता है।
assert (2 + 2 = 5), "Houston we've got a problem"
ठीक होना चाहिए, हाँ?
assert (2 + 2 = 5), "Houston we've got a problem"
काम नहीं करेगा ... लेकिन इसका मुखर कथन से कोई लेना-देना नहीं है, जो ठीक है। आपकी स्थिति काम नहीं करेगी क्योंकि यह एक शर्त नहीं है। एक सेकेंड मिस करना =
।
जैसा कि अन्य उत्तरों में उल्लेख किया गया है, assert
यदि दी गई स्थिति सत्य नहीं है तो अपवाद को फेंकने के समान है। एक महत्वपूर्ण अंतर यह है कि यदि आप अपने कोड को अनुकूलन विकल्प के साथ संकलित करते हैं तो मुखर बयानों को अनदेखा कर दिया जाता है -O
। प्रलेखन का कहना है कि assert expression
बेहतर के बराबर होने के रूप में वर्णित किया जा सकता
if __debug__:
if not expression: raise AssertionError
यह उपयोगी हो सकता है यदि आप अपने कोड का पूरी तरह से परीक्षण करना चाहते हैं, तो एक अनुकूलित संस्करण जारी करें जब आप खुश हों कि आपका कोई भी दावा विफल नहीं हो - जब अनुकूलन चालू होता है, तो __debug__
चर गलत हो जाता है और स्थितियों का मूल्यांकन बंद हो जाएगा। यदि आप आश्रितों पर भरोसा कर रहे हैं और वे गायब हो गए हैं इसका एहसास नहीं है, तो यह सुविधा भी आपको पकड़ सकती है।
if Not Error: raise Exception(“ this is a error”)
? इस तरह, प्रोग्राम अभी भी त्रुटि का स्रोत दिखाएगा, जब उपयोगकर्ता इसे चलाता है ..
assert
कथन का उपयोग करना चाहिए ? यहां धारणा यह है कि जब प्रोग्राम अंतिम उपयोगकर्ता के लिए जारी किया जाता है, तो आप -O ध्वज का उपयोग कर रहे हैं, इस प्रकार यह मानते हुए कि सभी बग हटा दिए गए हैं। इसलिए, कोई भी त्रुटि या प्रोग्राम क्रैश प्रोग्राम के लिए इनपुट के कारण है जो अनुबंध के अनुसार मान्य है, लेकिन कार्यक्रम को नियंत्रित नहीं किया जा सकता है। तो यह उपयोगकर्ता को इस तरह से सचेत करना चाहिए।
पायथन में एक जोर का लक्ष्य डेवलपर्स को एक कार्यक्रम में अपरिवर्तनीय त्रुटियों के बारे में सूचित करना है ।
अनुमानों को अपेक्षित त्रुटि स्थितियों को इंगित करने का इरादा नहीं है, जैसे "फ़ाइल नहीं मिली", जहां उपयोगकर्ता सुधारात्मक कार्रवाई कर सकता है (या बस फिर से)।
इसे देखने का एक और तरीका यह है कि आपके कोड में दावे आंतरिक आत्म-जांच हैं । वे आपके कोड में कुछ शर्तों को असंभव घोषित करके काम करते हैं । यदि ये स्थितियां नहीं पकड़ती हैं तो इसका मतलब है कि कार्यक्रम में बग है।
यदि आपका प्रोग्राम बग-रहित है, तो ये स्थितियाँ कभी नहीं होंगी। लेकिन अगर उनमें से एक होता है, तो यह प्रोग्राम एक जोरदार त्रुटि के साथ दुर्घटनाग्रस्त हो जाएगा, जो आपको बताएगा कि "असंभव" स्थिति को ट्रिगर किया गया था। इससे आपके कार्यक्रमों में बग को ट्रैक करना और ठीक करना बहुत आसान हो जाता है।
यहाँ पायथन के अभिकथन पर एक ट्यूटोरियल का सारांश मैंने लिखा है:
पायथन का मुखर कथन एक डिबगिंग सहायता है, न कि रन-टाइम त्रुटियों से निपटने के लिए एक तंत्र। मुखरता का उपयोग करने का लक्ष्य डेवलपर्स को बग के संभावित मूल कारण को अधिक तेज़ी से खोजने देना है। जब तक आपके प्रोग्राम में कोई बग न हो, तब तक एक त्रुटि को उठाया नहीं जाना चाहिए।
assert
कथन को समझने के लिए और इसका उपयोग करने के लिए बहुत उपयोगी है । मैं आपके द्वारा लेख में पेश किए गए कई शब्दों को समझने की कोशिश कर रहा हूं।
assert store.product_exists(product_id), 'Unknown product id'
यह एक अच्छा अभ्यास नहीं है, क्योंकि यदि डिबग को बंद कर दिया जाता है, तब user
भी यदि कोई admin
उत्पाद को हटाने में सक्षम नहीं होगा। क्या आप assert user.is_admin()
एक unrecoverable
त्रुटि मानते हैं ? ऐसा क्यों नहीं है self-check
?
assert statement
, तो price
भी उपयोगकर्ता इनपुट नहीं माना जा सकता है? आप assert user.is_admin()
डेटा सत्यापन के रूप में क्यों मानते हैं लेकिन नहीं assert price
?
दूसरों ने आपको पहले ही प्रलेखन के लिंक दिए हैं।
आप एक इंटरैक्टिव शेल में निम्नलिखित की कोशिश कर सकते हैं:
>>> assert 5 > 2
>>> assert 2 > 5
Traceback (most recent call last):
File "<string>", line 1, in <fragment>
builtins.AssertionError:
पहला बयान कुछ नहीं करता है, जबकि दूसरा एक अपवाद उठाता है। यह पहला संकेत है: ऐसी स्थितियाँ जो आपके कोड की दी गई स्थिति (आमतौर पर, शुरुआत (पूर्व शर्त) और एक फ़ंक्शन के अंत के बाद) में सही होने के लिए होनी चाहिए) की जाँच करने के लिए उपयोगी हैं।
असल में अनुबंध द्वारा प्रोग्रामिंग के लिए अत्यधिक बंधे हुए हैं, जो एक बहुत ही उपयोगी इंजीनियरिंग अभ्यास है:
डॉक्स से:
Assert statements are a convenient way to insert debugging assertions into a program
यहाँ आप और अधिक पढ़ सकते हैं: http://docs.python.org/release/2.5.2/ref/assert.html
यह सुनिश्चित करने के लिए कि एक प्रोग्रामर की आंतरिक स्थिति बग्स को पकड़ने के लक्ष्य के साथ है, यह परखने के लिए एक व्यवस्थित तरीका है। नीचे दिए गए उदाहरण देखें।
>>> number = input('Enter a positive number:')
Enter a positive number:-1
>>> assert (number > 0), 'Only positive numbers are allowed!'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AssertionError: Only positive numbers are allowed!
>>>
यहां एक सरल उदाहरण दिया गया है, इसे फ़ाइल में सहेजें (मान लें कि b.py)
def chkassert(num):
assert type(num) == int
chkassert('a')
और जब परिणाम $python b.py
Traceback (most recent call last):
File "b.py", line 5, in <module>
chkassert('a')
File "b.py", line 2, in chkassert
assert type(num) == int
AssertionError
यदि मुखर के बाद का कथन सही है, तो प्रोग्राम जारी रहता है, लेकिन यदि अभिकथन के बाद का कथन गलत है, तो प्रोग्राम त्रुटि देता है। इतना ही आसान।
उदाहरण के लिए:
assert 1>0 #normal execution
assert 0>1 #Traceback (most recent call last):
#File "<pyshell#11>", line 1, in <module>
#assert 0>1
#AssertionError
assert
बयान लगभग हर प्रोग्रामिंग भाषा में मौजूद है। यह आपके प्रोग्राम में शुरुआती समस्याओं का पता लगाने में मदद करता है, जहां कारण स्पष्ट है, बजाय बाद में कुछ अन्य ऑपरेशन के साइड-इफेक्ट के रूप में। वे हमेशा एक True
शर्त की उम्मीद करते हैं।
जब आप कुछ ऐसा करते हैं:
assert condition
आप प्रोग्राम को उस स्थिति का परीक्षण करने और झूठा होने पर तुरंत त्रुटि को ट्रिगर करने के लिए कह रहे हैं।
पायथन में, assert
अभिव्यक्ति , इसके बराबर है:
if __debug__:
if not <expression>: raise AssertionError
आप वैकल्पिक संदेश पास करने के लिए विस्तारित अभिव्यक्ति का उपयोग कर सकते हैं :
if __debug__:
if not (expression_1): raise AssertionError(expression_2)
अजगर दुभाषिया में इसे आज़माएँ:
>>> assert True # Nothing happens because the condition returns a True value.
>>> assert False # A traceback is triggered because this evaluation did not yield an expected value.
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AssertionError
मुख्य रूप से उन लोगों के लिए उपयोग करने से पहले उन्हें देखा जाता है जो बयान assert
और if
बयानों के बीच टॉगल करते हैं। उपयोग करने का उद्देश्य उन assert
अवसरों पर होता है जब कार्यक्रम एक स्थिति की पुष्टि करता है और एक मान लौटाता है जो त्रुटि को बायपास करने के लिए कुछ वैकल्पिक तरीके लेने के बजाय कार्यक्रम को तुरंत रोकना चाहिए:
जैसा कि आपने देखा होगा, assert
कथन दो स्थितियों का उपयोग करता है। इसलिए, स्पष्ट सलाह के लिए उन्हें संलग्न करने के लिए कोष्ठक का उपयोग न करें। यदि आप ऐसा करते हैं:
assert (condition, message)
उदाहरण:
>>> assert (1==2, 1==1)
<stdin>:1: SyntaxWarning: assertion is always true, perhaps remove parentheses?
आप के assert
साथ चल रहा होगा (condition, message)
जो पहले पैरामीटर के रूप में एक टपल का प्रतिनिधित्व करता है, और ऐसा होता है पायथन में गैर-खाली ट्यूपल हमेशा होता हैTrue
। हालाँकि, आप समस्या के बिना अलग से कर सकते हैं:
assert (condition), "message"
उदाहरण:
>>> assert (1==2), ("This condition returns a %s value.") % "False"
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AssertionError: This condition returns a False value.
यदि आप assert
स्टेटमेंट का उपयोग करते समय सोच रहे हैं । वास्तविक जीवन में प्रयुक्त एक उदाहरण लें:
* जब आपका प्रोग्राम उपयोगकर्ता द्वारा दर्ज किए गए प्रत्येक पैरामीटर या अन्य जो कुछ भी नियंत्रित करता है:
def loremipsum(**kwargs):
kwargs.pop('bar') # return 0 if "bar" isn't in parameter
kwargs.setdefault('foo', type(self)) # returns `type(self)` value by default
assert (len(kwargs) == 0), "unrecognized parameter passed in %s" % ', '.join(kwargs.keys())
* एक अन्य मामला गणित पर है जब 0 या गैर-सकारात्मक एक निश्चित समीकरण पर गुणांक या स्थिर के रूप में होता है:
def discount(item, percent):
price = int(item['price'] * (1.0 - percent))
print(price)
assert (0 <= price <= item['price']),\
"Discounted prices cannot be lower than 0 "\
"and they cannot be higher than the original price."
return price
* या बूलियन कार्यान्वयन का एक सरल उदाहरण:
def true(a, b):
assert (a == b), "False"
return 1
def false(a, b):
assert (a != b), "True"
return 0
अत्यंत महत्त्वपूर्ण बात यह है कि assert
डेटा प्रोसेसिंग या डेटा सत्यापन को निष्पादित करने के लिए कथन पर भरोसा नहीं करना चाहिए क्योंकि यह कथन क्रमशः पायथन इनिशियलाइज़ेशन -O
या -OO
फ़्लैग - अर्थ मान 1, 2, और 0 (डिफ़ॉल्ट रूप से) के साथ बंद किया जा सकता है - या PYTHONOPTIMIZE
पर्यावरण चर ।
मान 1:
* asserts अक्षम हैं;
* बाइटकोड फ़ाइलों के .pyo
बजाय विस्तार का उपयोग कर उत्पन्न कर रहे हैं .pyc
;
* sys.flags.optimize
1 पर सेट है ( True
);
*, और __debug__
सेट है False
;
मान 2: एक और सामान को अक्षम करता है
* docstrings अक्षम हैं;
इसलिए, assert
एक प्रकार के अपेक्षित डेटा को मान्य करने के लिए बयान का उपयोग करना बेहद खतरनाक है, यहां तक कि कुछ सुरक्षा मुद्दों पर भी निर्भर करता है। फिर, यदि आपको कुछ अनुमति मान्य करने की आवश्यकता है, तो मैं आपको raise AuthError
इसके बजाय सलाह देता हूं । एक प्रारंभिक प्रभावी के रूप में, एक assert
आमतौर पर पुस्तकालयों या मॉड्यूल पर प्रोग्रामर द्वारा उपयोग किया जाता है जिनके पास सीधे उपयोगकर्ता बातचीत नहीं होती है।
संक्षेप में C2 विकी पर संक्षिप्त रूप में :
किसी कार्यक्रम में एक विशिष्ट बिंदु पर एक बूलियन अभिव्यक्ति है जो तब तक सच होगी जब तक कि कार्यक्रम में कोई बग न हो।
आप assert
एक विशेष कार्यक्रम बिंदु पर कोड की अपनी समझ को दस्तावेज करने के लिए एक बयान का उपयोग कर सकते हैं । उदाहरण के लिए, आप इनपुट्स (प्रीकॉन्डिशंस), प्रोग्राम स्टेट (इनवेरिएंट्स), या आउटपुट (पोस्टकंडिशन) के बारे में मान्यताओं या गारंटी को दस्तावेज कर सकते हैं।
क्या आपका जोर कभी विफल होना चाहिए, यह आपके (या आपके उत्तराधिकारी) के लिए एक चेतावनी है कि कार्यक्रम की आपकी समझ गलत थी जब आपने इसे लिखा था, और यह संभव है कि इसमें एक बग हो।
अधिक जानकारी के लिए, जॉन रेगेह्र ने यूज़ पर एक अद्भुत ब्लॉग पोस्ट किया है , जो कि पायथन के assert
कथन पर भी लागू होता है ।
पायथॉन एस्सर मूल रूप से एक डिबगिंग सहायता है जो आपके कोड की आंतरिक स्व-जांच के लिए परीक्षण की स्थिति है। जब आपका कोड असंभव किनारे के मामलों में हो जाता है, तो Assert वास्तव में डिबगिंग को आसान बनाता है। उन असंभव मामलों की जाँच करें।
मान लें कि छूट के बाद आइटम की कीमत की गणना करने के लिए एक फ़ंक्शन है:
def calculate_discount(price, discount):
discounted_price = price - [discount*price]
assert 0 <= discounted_price <= price
return discounted_price
यहां, रियायती_प्रकार 0 से कम और वास्तविक मूल्य से अधिक कभी नहीं हो सकता है। इसलिए, यदि उपरोक्त शर्त का उल्लंघन किया जाता है, तो मुखर एक त्रुटि उत्पन्न करता है, जो डेवलपर को यह पहचानने में मदद करता है कि कुछ असंभव हुआ था।
आशा है ये मदद करेगा :)
assert
डिबगिंग संदर्भ में उपयोगी है, लेकिन डिबगिंग संदर्भ के बाहर निर्भर नहीं होना चाहिए।
मेरी संक्षिप्त व्याख्या है:
assert
AssertionError
यदि अभिव्यक्ति झूठी है, तो उठाता है, अन्यथा बस कोड जारी रहता है, और यदि कोई अल्पविराम है तो वह जो भी होगा AssertionError: whatever after comma
, और कोड के लिए निम्न हैं:raise AssertionError(whatever after comma)
इस बारे में संबंधित ट्यूटोरियल:
https://www.tutorialspoint.com/python/assertions_in_python.htm
assert
, लेकिन जब उपयोग नहीं करना है (या उपयोग नहीं करना है) ए assert
; यह भी ध्यान देने योग्य बात है कि एक assert
विकलांग हो सकता है अगर __debug__
यह है False
उपयोगी होगा।
Pycharm में, यदि आप का उपयोग assert
के साथ isinstance
एक वस्तु के प्रकार की घोषणा करने के लिए, यह आप तरीकों का उपयोग और माता पिता वस्तु की विशेषताओं, जबकि आप, कोडिंग कर रहे हैं यह स्वत: पूर्ण स्वचालित रूप से होगा करने देगा।
उदाहरण के लिए, मान लें कि self.object1.object2
एक MyClass
वस्तु है।
import MyClasss
def code_it(self):
testObject = self.object1.object2 # at this point, program doesn't know that testObject is a MyClass object yet
assert isinstance(testObject , MyClasss) # now the program knows testObject is a MyClass object
testObject.do_it() # from this point on, PyCharm will be able to auto-complete when you are working on testObject
जैसा कि अन्य उत्तरों में लिखा गया है, assert
बयानों का उपयोग किसी दिए गए बिंदु पर कार्यक्रम की स्थिति की जांच करने के लिए किया जाता है।
मैं संबंधित संदेश, कोष्ठक, या -O
विकल्प और __debug__
निरंतर के बारे में जो कहा गया था उसे नहीं दोहराऊंगा । पहले हाथ की जानकारी के लिए डॉक्टर की जाँच भी करें । मैं आपके प्रश्न पर ध्यान केंद्रित करूंगा: इसका क्या उपयोग है assert
? अधिक सटीक रूप से, कब (और कब नहीं) एक का उपयोग करना चाहिए assert
?
assert
बयान एक कार्यक्रम डिबग करने के लिए उपयोगी होते हैं, लेकिन उपयोगकर्ता इनपुट की जाँच करने के लिए हतोत्साहित किया। मैं अंगूठे के निम्नलिखित नियम का उपयोग करता हूं: यह पता लगाने के लिए कि यह स्थिति नहीं होनी चाहिए । एक उपयोगकर्ता इनपुट गलत हो सकता है, उदाहरण के लिए एक पासवर्ड बहुत छोटा है, लेकिन ऐसा नहीं है यह मामला नहीं होना चाहिए । यदि किसी वृत्त का व्यास उसकी त्रिज्या से दोगुना नहीं है, तो आप इस स्थिति में नहीं हैं ।
मेरे दिमाग में सबसे दिलचस्प, उपयोग अनुबंध द्वारा प्रोग्रामिंग सेassert
प्रेरित है
द्वारा बी। मेयर द्वारा वर्णित ऑब्जेक्ट [वस्तु-उन्मुख सॉफ्टवेयर निर्माण] (
https://www.eiffel.org/doc/eiffel/Object-Oriented_oftware_Construction% 2C_2nd_Edition
) और [एफिल प्रोग्रामिंग भाषा] ( https://en.wikipedia.org/wiki/Eiffel_(programming_language) में लागू किया गया
। आप assert
कथन का उपयोग करके अनुबंध द्वारा प्रोग्रामिंग का पूरी तरह से अनुकरण नहीं कर सकते , लेकिन यह इरादे को बनाए रखने के लिए दिलचस्प है।
यहाँ एक उदाहरण है। कल्पना कीजिए कि आपको एक head
फ़ंक्शन लिखना है (जैसे [head
हास्केल में फ़ंक्शन] (
http://www.zvon.org/other/haskell/Outputprelude/head_f.html )। आपको जो विनिर्देश दिए गए हैं, वह है: "यदि सूची खाली नहीं है, तो सूची का पहला आइटम लौटाएं"। निम्नलिखित कार्यान्वयन देखें:
>>> def head1(xs): return xs[0]
तथा
>>> def head2(xs):
... if len(xs) > 0:
... return xs[0]
... else:
... return None
(हां, इस रूप में लिखा जा सकता है return xs[0] if xs else None
, लेकिन यह बात नहीं है) ।
यदि सूची खाली नहीं है, तो दोनों कार्यों का परिणाम समान है और यह परिणाम सही है:
>>> head1([1, 2, 3]) == head2([1, 2, 3]) == 1
True
इसलिए, दोनों कार्यान्वयन सही हैं (मुझे उम्मीद है)। जब आप खाली सूची का मुख्य आइटम लेने की कोशिश करते हैं तो वे भिन्न होते हैं:
>>> head1([])
Traceback (most recent call last):
...
IndexError: list index out of range
परंतु:
>>> head2([]) is None
True
फिर से, दोनों कार्यान्वयन सही हैं, क्योंकि किसी को भी इन कार्यों के लिए एक खाली सूची पास नहीं करनी चाहिए (हम विनिर्देश से बाहर हैं )। यह एक गलत कॉल है, लेकिन अगर आप ऐसी कॉल करते हैं, तो कुछ भी हो सकता है। एक फ़ंक्शन एक अपवाद उठाता है, दूसरा एक विशेष मूल्य देता है। सबसे महत्वपूर्ण है: हम इस व्यवहार पर भरोसा नहीं कर सकते । अगरxs
खाली है, तो यह काम करेगा:
print(head2(xs))
लेकिन इससे प्रोग्राम क्रैश हो जाएगा:
print(head1(xs))
कुछ आश्चर्य से बचने के लिए, मैं जानना चाहूंगा कि जब मैं किसी समारोह में कुछ अप्रत्याशित तर्क दे रहा हूं। दूसरे शब्दों में: मैं जानना चाहूंगा कि जब अवलोकन योग्य व्यवहार विश्वसनीय नहीं है, क्योंकि यह कार्यान्वयन पर निर्भर करता है, विनिर्देश पर नहीं। बेशक, मैं विनिर्देश पढ़ सकता हूं, लेकिन प्रोग्रामर हमेशा डॉक्स को ध्यान से नहीं पढ़ते हैं।
कल्पना कीजिए कि अगर मेरे पास निम्नलिखित प्रभाव प्राप्त करने के लिए विनिर्देश को कोड में सम्मिलित करने का एक तरीका था: जब मैं विनिर्देश का उल्लंघन करता हूं, जैसे कि खाली सूची को पास करने से head
, मुझे चेतावनी मिलती है। यह सही लिखने के लिए एक बड़ी मदद होगी (यानी विनिर्देश के अनुरूप)। और वह assert
दृश्य में प्रवेश करती है:
>>> def head1(xs):
... assert len(xs) > 0, "The list must not be empty"
... return xs[0]
तथा
>>> def head2(xs):
... assert len(xs) > 0, "The list must not be empty"
... if len(xs) > 0:
... return xs[0]
... else:
... return None
अब हमारे पास है:
>>> head1([])
Traceback (most recent call last):
...
AssertionError: The list must not be empty
तथा:
>>> head2([])
Traceback (most recent call last):
...
AssertionError: The list must not be empty
ध्यान दें कि head1
ए फेंकता है AssertionError
, ए नहीं IndexError
। यही कारण है कि महत्वपूर्ण है क्योंकि एक AssertionError
नहीं है किसी भी रनटाइम त्रुटि: यह विनिर्देश का उल्लंघन संकेत देती है। मैं एक चेतावनी चाहता था, लेकिन मुझे एक त्रुटि मिलती है। सौभाग्य से, मैं चेक को अक्षम कर सकता हूं (का उपयोग करके)-O
विकल्प ) , लेकिन अपने जोखिम पर। मैं यह करूँगा कि एक दुर्घटना वास्तव में महंगी है, और सर्वश्रेष्ठ के लिए आशा है। कल्पना कीजिए कि मेरा कार्यक्रम एक अंतरिक्ष यान में सन्निहित है जो एक ब्लैक होल के माध्यम से यात्रा करता है। मैं मुखरता को निष्क्रिय कर दूंगा और आशा करता हूं कि कार्यक्रम तब तक मजबूत रहेगा जब तक दुर्घटना न हो।
यह उदाहरण केवल पूर्व शर्त के बारे में था, हो सकता है कि आप assert
पोस्टकंडिशन (रिटर्न वैल्यू और / या स्टेट) और इन्वर्टर (एक वर्ग की स्थिति) की जांच करने के लिए उपयोग कर सकते हैं । ध्यान दें कि पोस्टकंडिशन और इन्वर्टर की जाँच करना assert
बोझिल हो सकता है:
आपके पास एफिल के रूप में परिष्कृत कुछ नहीं होगा, लेकिन फिर भी आप एक कार्यक्रम की समग्र गुणवत्ता में सुधार कर सकते हैं।
संक्षेप में, assert
कथन यह पता लगाने के लिए एक सुविधाजनक तरीका है कि यह स्थिति नहीं होनी चाहिए । विनिर्देश के उल्लंघन (उदाहरण के लिए एक खाली सूची पास करना head
) प्रथम श्रेणी के होते हैं, यह स्थितियों में नहीं होना चाहिए । इसलिए, जबकि assert
कथन का उपयोग किसी भी अप्रत्याशित स्थिति का पता लगाने के लिए किया जा सकता है, यह सुनिश्चित करने के लिए एक विशेषाधिकार प्राप्त तरीका है कि विनिर्देश पूरा हो गया है। एक बार जब आप assert
विनिर्देश का प्रतिनिधित्व करने के लिए कोड में बयान डालते हैं , तो हम आशा कर सकते हैं कि आपने कार्यक्रम की गुणवत्ता में सुधार किया है क्योंकि गलत तर्क, गलत रिटर्न मान, एक वर्ग की गलत स्थिति ... की सूचना दी जाएगी।
प्रारूप: मुखर अभिव्यक्ति [, तर्क] जब मुखर एक बयान का सामना करता है, तो पायथन अभिव्यक्ति का मूल्यांकन करता है। यदि कथन सत्य नहीं है, तो एक अपवाद उठाया जाता है (जोर)। यदि दावा विफल हो जाता है, तो पायथन तर्क के रूप में तर्क का उपयोग करता है। जोर-जबरदस्ती के अपवादों को किसी अन्य अपवाद की तरह पकड़ा जा सकता है और कोशिश-को छोड़कर बयान का उपयोग किया जा सकता है, लेकिन यदि संभाला नहीं जाता है, तो वे कार्यक्रम को समाप्त कर देंगे और ट्रेसबैक का उत्पादन करेंगे। उदाहरण:
def KelvinToFahrenheit(Temperature):
assert (Temperature >= 0),"Colder than absolute zero!"
return ((Temperature-273)*1.8)+32
print KelvinToFahrenheit(273)
print int(KelvinToFahrenheit(505.78))
print KelvinToFahrenheit(-5)
जब उपरोक्त कोड निष्पादित किया जाता है, तो यह निम्नलिखित परिणाम उत्पन्न करता है:
32.0
451
Traceback (most recent call last):
File "test.py", line 9, in <module>
print KelvinToFahrenheit(-5)
File "test.py", line 4, in KelvinToFahrenheit
assert (Temperature >= 0),"Colder than absolute zero!"
AssertionError: Colder than absolute zero!
def getUser(self, id, Email):
user_key = id and id or Email
assert user_key
फ़ंक्शन कॉल में पैरामीटर पारित करने के लिए सुनिश्चित करने के लिए इस्तेमाल किया जा सकता है।
if not user_key: raise ValueError()
यहां अंतिम 2 पैराग्राफ चेक की जांच करें: wiki.python.org/moin/UsingAssertionsEffectively
assert
इनपुट सत्यापन के लिए उपयोग नहीं किया जाना चाहिए क्योंकि या तो सत्यापन को बाहर निकाल दिया जाएगा यदि __debug__
है False
। गैर-डीबग उद्देश्यों के लिए अभिकथन का उपयोग करने के कारण लोग परिणामस्वरूप AssertionError
एस को पकड़ सकते हैं, जो डिबगिंग को कम करने के बजाय अधिक कठिन बना सकता है।
>>>this_is_very_complex_function_result = 9
>>>c = this_is_very_complex_function_result
>>>test_us = (c < 4)
>>> #first we try without assert
>>>if test_us == True:
print("YES! I am right!")
else:
print("I am Wrong, but the program still RUNS!")
I am Wrong, but the program still RUNS!
>>> #now we try with assert
>>> assert test_us
Traceback (most recent call last):
File "<pyshell#52>", line 1, in <module>
assert test_us
AssertionError
>>>
मूल रूप से मुखर कीवर्ड का अर्थ यह है कि यदि स्थिति सही नहीं है, तो एक जोर के माध्यम से यह अजगर में उदाहरण के लिए जारी है।
कोड-1
a=5
b=6
assert a==b
उत्पादन:
assert a==b
AssertionError
कोड-2
a=5
b=5
assert a==b
उत्पादन:
Process finished with exit code 0
assert
लिए, लेकिन जवाब नहीं देता जब उपयोग करने के लिए (या नहीं का उपयोग करें) एक assert
।