पायथन में "मुखर" का उपयोग क्या है?


959

मैं कुछ स्रोत कोड पढ़ रहा हूं और कई जगहों पर मैंने इसका उपयोग देखा है assert

इसका वास्तव में क्या मतलब है? इसका क्या उपयोग है?


जवाबों:


1082

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

प्रासंगिक दस्तावेज के लिए यहां देखें ।


92
Nit: मुखर एक बयान है और एक फ़ंक्शन नहीं है। और प्रिंट के विपरीत , पायथन 3 में यह अभी भी एक बयान है
बॉब स्टीन

2
@ अचिन्त्य मुखर का अर्थ है "सुनिश्चित करें कि * कुछ" सत्य है "। अतः = a = 3 यह सुनिश्चित करेगा कि a 3 के बराबर है; यदि 3 के बराबर नहीं है (अर्थात a = 3 गलत है) तो यह होगा एक त्रुटि
Ant

5
अगर मैं सिर्फ उपयोग कर सकता हूं if not condition: raise AssertError(), तो मुझे मुखर का उपयोग क्यों करना चाहिए? क्या कोई ऐसी स्थिति है जिसके तहत मुखर केवल if not conditionबयान के एक छोटे रूप के अलावा बेहतर है ?
अल्फा_989

6
@ अल्फ़ा_989 ए) यह छोटा और अधिक पठनीय है, बी) आप दुभाषिया चलाते समय मुखर बयानों को निष्क्रिय कर सकते हैं (मैनुअल के साथ ऐसा नहीं है if)। अधिक जानकारी के लिए डॉक्स पढें :)
slezica

9
पूरी तरह से नहीं मिल सकता है कि इस जवाब को इतने वोट कैसे मिलते हैं, वास्तव में दूसरों के जवाब भी। सवाल "पायथन में" मुखर "का उपयोग क्या है?", इसलिए यह पूछ रहा है: कब उपयोग करना है, या अधिक सटीक: उपयोग परिदृश्य क्या है assert, लेकिन सभी उत्तरों को पढ़ने के बाद, मुझे पूरी तरह से कुछ भी नहीं चाहिए!
लांशी

422

कोष्ठक के लिए बाहर देखो। जैसा कि ऊपर बताया गया है, पायथन 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बूलियन संदर्भ में मूल्यांकन किया जाता है।


18
मैं यहाँ परेंस और फॉलो मैसेज के बारे में इस सटीक जानकारी की तलाश में आया था। धन्यवाद।
सुपरबेक

6
लेकिन assert (2 + 2 = 5), "Houston we've got a problem"ठीक होना चाहिए, हाँ?
SherylHohman

4
@SherylHohman आप खुद भी इसे चलाने की कोशिश कर सकते हैं और देख सकते हैं कि यह काम करता है या नहीं
DarkCygnus

2
यह मत भूलो कि लोग अक्सर PEP 8-आज्ञाकारी निहित लाइन निरंतरता के लिए कोष्ठक का उपयोग करते हैं। यह भी मत भूलो कि tuples को कोष्ठक द्वारा परिभाषित नहीं किया गया है, लेकिन अल्पविराम के अस्तित्व के साथ (tuples का संबंध माता-पिता के अलावा कुछ भी नहीं है संचालक वरीयता)।
काऊबर्ट

4
assert (2 + 2 = 5), "Houston we've got a problem"काम नहीं करेगा ... लेकिन इसका मुखर कथन से कोई लेना-देना नहीं है, जो ठीक है। आपकी स्थिति काम नहीं करेगी क्योंकि यह एक शर्त नहीं है। एक सेकेंड मिस करना =
n1k31t4

133

जैसा कि अन्य उत्तरों में उल्लेख किया गया है, assertयदि दी गई स्थिति सत्य नहीं है तो अपवाद को फेंकने के समान है। एक महत्वपूर्ण अंतर यह है कि यदि आप अपने कोड को अनुकूलन विकल्प के साथ संकलित करते हैं तो मुखर बयानों को अनदेखा कर दिया जाता है -Oप्रलेखन का कहना है कि assert expressionबेहतर के बराबर होने के रूप में वर्णित किया जा सकता

if __debug__:
   if not expression: raise AssertionError

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


क्या इसका मतलब यह है कि अगर एक निश्चित चर या सही इनपुट (अनुबंध के अनुसार जिसके द्वारा प्रोग्राम लिखा गया है) प्रोग्राम को क्रैश करने का कारण बन सकता है, जब उपयोगकर्ता द्वारा इसका रन (उस -O ध्वज का उपयोग किया जाता है जब उपयोगकर्ता चलाता है कार्यक्रम), आप इसके बजाय का उपयोग करना चाहिए if Not Error: raise Exception(“ this is a error”)? इस तरह, प्रोग्राम अभी भी त्रुटि का स्रोत दिखाएगा, जब उपयोगकर्ता इसे चलाता है ..
अल्फा_989

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

@ अल्फ़ा_989 बिलकुल सही है। मैं संन्यास की जाँच के बारे में सोचना पसंद करता हूँ जो केवल एक डेवलपर के रूप में आपकी सहायता करने के लिए हैं ताकि यह सुनिश्चित हो सके कि आप जो सोचते हैं वह वास्तव में सच है जबकि आप विकसित होते हैं।
क्रिस्टोफर श्रोबा

52

पायथन में एक जोर का लक्ष्य डेवलपर्स को एक कार्यक्रम में अपरिवर्तनीय त्रुटियों के बारे में सूचित करना है ।

अनुमानों को अपेक्षित त्रुटि स्थितियों को इंगित करने का इरादा नहीं है, जैसे "फ़ाइल नहीं मिली", जहां उपयोगकर्ता सुधारात्मक कार्रवाई कर सकता है (या बस फिर से)।

इसे देखने का एक और तरीका यह है कि आपके कोड में दावे आंतरिक आत्म-जांच हैं । वे आपके कोड में कुछ शर्तों को असंभव घोषित करके काम करते हैं । यदि ये स्थितियां नहीं पकड़ती हैं तो इसका मतलब है कि कार्यक्रम में बग है।

यदि आपका प्रोग्राम बग-रहित है, तो ये स्थितियाँ कभी नहीं होंगी। लेकिन अगर उनमें से एक होता है, तो यह प्रोग्राम एक जोरदार त्रुटि के साथ दुर्घटनाग्रस्त हो जाएगा, जो आपको बताएगा कि "असंभव" स्थिति को ट्रिगर किया गया था। इससे आपके कार्यक्रमों में बग को ट्रैक करना और ठीक करना बहुत आसान हो जाता है।

यहाँ पायथन के अभिकथन पर एक ट्यूटोरियल का सारांश मैंने लिखा है:

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


लेख के लिए धन्यवाद। assertकथन को समझने के लिए और इसका उपयोग करने के लिए बहुत उपयोगी है । मैं आपके द्वारा लेख में पेश किए गए कई शब्दों को समझने की कोशिश कर रहा हूं।
अल्फा_989

मैंने सोचा कि मैं यहाँ टिप्पणियाँ पोस्ट करूँगा ताकि बहुत से लोगों को स्पष्टीकरण से लाभान्वित किया जा सके। क्षमा करें यदि प्रश्न बहुत भोले हैं।
अल्फा_989

आपके द्वारा लिंक किए गए अपने ब्लॉग में, आप एक उदाहरण देते हैं जहां आपने उल्लेख किया है कि `assert 0 <= price <= product ['price']` सही है, लेकिन `asser user.is_admin () का उपयोग करके, 'हटाने के लिए व्यवस्थापक विशेषाधिकार होना चाहिए '`और assert store.product_exists(product_id), 'Unknown product id'यह एक अच्छा अभ्यास नहीं है, क्योंकि यदि डिबग को बंद कर दिया जाता है, तब userभी यदि कोई adminउत्पाद को हटाने में सक्षम नहीं होगा। क्या आप assert user.is_admin()एक unrecoverableत्रुटि मानते हैं ? ऐसा क्यों नहीं है self-check?
अल्फा_989

यदि आप मानते हैं कि 'user.is_admin () `एक उपयोगकर्ता इनपुट है और इसलिए इसका उपयोग नहीं किया जाना चाहिए assert statement, तो priceभी उपयोगकर्ता इनपुट नहीं माना जा सकता है? आप assert user.is_admin()डेटा सत्यापन के रूप में क्यों मानते हैं लेकिन नहीं assert price?
अल्फा_989

1
@LaryxDecidua नहीं, आप इसे सिर्फ मेरी वेबसाइट पर पढ़ सकते हैं, ट्यूटोरियल सार्वजनिक रूप से उपलब्ध है। यदि आप समाचार पत्र में रुचि नहीं रखते हैं तो बस बचकर निकलें या छोटे "x" चिन्ह पर क्लिक करें। आशा है कि यह मदद करता है :-)
dader

51

दूसरों ने आपको पहले ही प्रलेखन के लिंक दिए हैं।

आप एक इंटरैक्टिव शेल में निम्नलिखित की कोशिश कर सकते हैं:

>>> assert 5 > 2
>>> assert 2 > 5
Traceback (most recent call last):
  File "<string>", line 1, in <fragment>
builtins.AssertionError:

पहला बयान कुछ नहीं करता है, जबकि दूसरा एक अपवाद उठाता है। यह पहला संकेत है: ऐसी स्थितियाँ जो आपके कोड की दी गई स्थिति (आमतौर पर, शुरुआत (पूर्व शर्त) और एक फ़ंक्शन के अंत के बाद) में सही होने के लिए होनी चाहिए) की जाँच करने के लिए उपयोगी हैं।

असल में अनुबंध द्वारा प्रोग्रामिंग के लिए अत्यधिक बंधे हुए हैं, जो एक बहुत ही उपयोगी इंजीनियरिंग अभ्यास है:

http://en.wikipedia.org/wiki/Design_by_contract


तो क्या इसका मतलब है कि हम कोड में परख सकते हैं जैसे कि (2> 5) और आगे भी जारी है?

20
पार्स खोना, मुखर एक कार्य नहीं है।
स्तंभकार

2
परदों को खोना जितना ज़रूरी है उससे कहीं ज़्यादा ज़रूरी है। नीचे देखें ।
इवगेनी

6
ट्यूरिंग के अनुसार, जब वह प्रोग्रामर सही प्रोग्राम बनाने के बजाए कठिन काम को निपटा सकता है, तो सबसे शुरुआती कागजों में से एक लिखकर, ट्यूरिंग को वास्तव में वापस लाने का दावा करता है। उस पेपर को पाठक के लिए एक अभ्यास के रूप में छोड़ दिया गया है, क्योंकि सभी प्रोग्रामर अपने काम से परिचित होने से लाभ उठा सकते हैं। :-) turingarchive.org
रॉन बुर्क

17

डॉक्स से:

Assert statements are a convenient way to insert debugging assertions into a program

यहाँ आप और अधिक पढ़ सकते हैं: http://docs.python.org/release/2.5.2/ref/assert.html


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

17

मुखर कथन के दो रूप हैं।

सरल रूप,, के assert <expression>बराबर है

if __debug__:
    if not <expression>: raise AssertionError

विस्तारित प्रपत्र, के assert <expression1>, <expression2>बराबर है

if __debug__:
    if not <expression1>: raise AssertionError, <expression2>

16

यह सुनिश्चित करने के लिए कि एक प्रोग्रामर की आंतरिक स्थिति बग्स को पकड़ने के लक्ष्य के साथ है, यह परखने के लिए एक व्यवस्थित तरीका है। नीचे दिए गए उदाहरण देखें।

>>> 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!
>>> 

1
इसके अलावा, अभिकर्मकों का उपयोग अक्सर इकाई परीक्षण कार्यक्रमों में किया जा सकता है। stackoverflow.com/questions/1383/what-is-unit-testing
panofish

7

यहां एक सरल उदाहरण दिया गया है, इसे फ़ाइल में सहेजें (मान लें कि 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

6

यदि मुखर के बाद का कथन सही है, तो प्रोग्राम जारी रहता है, लेकिन यदि अभिकथन के बाद का कथन गलत है, तो प्रोग्राम त्रुटि देता है। इतना ही आसान।

उदाहरण के लिए:

assert 1>0   #normal execution
assert 0>1   #Traceback (most recent call last):
             #File "<pyshell#11>", line 1, in <module>
             #assert 0>1
             #AssertionError

4

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अवसरों पर होता है जब कार्यक्रम एक स्थिति की पुष्टि करता है और एक मान लौटाता है जो त्रुटि को बायपास करने के लिए कुछ वैकल्पिक तरीके लेने के बजाय कार्यक्रम को तुरंत रोकना चाहिए:

1. कोष्ठक

जैसा कि आपने देखा होगा, 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.

2. डिबग उद्देश्य

यदि आप 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

3. डाटा प्रोसेसिंग या डेटा सत्यापन

अत्यंत महत्त्वपूर्ण बात यह है कि assertडेटा प्रोसेसिंग या डेटा सत्यापन को निष्पादित करने के लिए कथन पर भरोसा नहीं करना चाहिए क्योंकि यह कथन क्रमशः पायथन इनिशियलाइज़ेशन -Oया -OOफ़्लैग - अर्थ मान 1, 2, और 0 (डिफ़ॉल्ट रूप से) के साथ बंद किया जा सकता है - या PYTHONOPTIMIZEपर्यावरण चर ।

मान 1:

* asserts अक्षम हैं;

* बाइटकोड फ़ाइलों के .pyoबजाय विस्तार का उपयोग कर उत्पन्न कर रहे हैं .pyc;

* sys.flags.optimize1 पर सेट है ( True);

*, और __debug__सेट है False;

मान 2: एक और सामान को अक्षम करता है

* docstrings अक्षम हैं;

इसलिए, assertएक प्रकार के अपेक्षित डेटा को मान्य करने के लिए बयान का उपयोग करना बेहद खतरनाक है, यहां तक ​​कि कुछ सुरक्षा मुद्दों पर भी निर्भर करता है। फिर, यदि आपको कुछ अनुमति मान्य करने की आवश्यकता है, तो मैं आपको raise AuthErrorइसके बजाय सलाह देता हूं । एक प्रारंभिक प्रभावी के रूप में, एक assertआमतौर पर पुस्तकालयों या मॉड्यूल पर प्रोग्रामर द्वारा उपयोग किया जाता है जिनके पास सीधे उपयोगकर्ता बातचीत नहीं होती है।


3

संक्षेप में C2 विकी पर संक्षिप्त रूप में :

किसी कार्यक्रम में एक विशिष्ट बिंदु पर एक बूलियन अभिव्यक्ति है जो तब तक सच होगी जब तक कि कार्यक्रम में कोई बग न हो।

आप assertएक विशेष कार्यक्रम बिंदु पर कोड की अपनी समझ को दस्तावेज करने के लिए एक बयान का उपयोग कर सकते हैं । उदाहरण के लिए, आप इनपुट्स (प्रीकॉन्डिशंस), प्रोग्राम स्टेट (इनवेरिएंट्स), या आउटपुट (पोस्टकंडिशन) के बारे में मान्यताओं या गारंटी को दस्तावेज कर सकते हैं।

क्या आपका जोर कभी विफल होना चाहिए, यह आपके (या आपके उत्तराधिकारी) के लिए एक चेतावनी है कि कार्यक्रम की आपकी समझ गलत थी जब आपने इसे लिखा था, और यह संभव है कि इसमें एक बग हो।

अधिक जानकारी के लिए, जॉन रेगेह्र ने यूज़ पर एक अद्भुत ब्लॉग पोस्ट किया है , जो कि पायथन के assertकथन पर भी लागू होता है ।


2

यदि आप कभी भी जानना चाहते हैं कि एक आरक्षित फ़ंक्शन अजगर में क्या करता है, तो टाइप करें help(enter_keyword)

सुनिश्चित करें कि यदि आप एक आरक्षित कीवर्ड दर्ज कर रहे हैं जो आप इसे एक स्ट्रिंग के रूप में दर्ज करते हैं।


2

पायथॉन एस्सर मूल रूप से एक डिबगिंग सहायता है जो आपके कोड की आंतरिक स्व-जांच के लिए परीक्षण की स्थिति है। जब आपका कोड असंभव किनारे के मामलों में हो जाता है, तो Assert वास्तव में डिबगिंग को आसान बनाता है। उन असंभव मामलों की जाँच करें।

मान लें कि छूट के बाद आइटम की कीमत की गणना करने के लिए एक फ़ंक्शन है:

def calculate_discount(price, discount):
    discounted_price = price - [discount*price]
    assert 0 <= discounted_price <= price
    return discounted_price

यहां, रियायती_प्रकार 0 से कम और वास्तविक मूल्य से अधिक कभी नहीं हो सकता है। इसलिए, यदि उपरोक्त शर्त का उल्लंघन किया जाता है, तो मुखर एक त्रुटि उत्पन्न करता है, जो डेवलपर को यह पहचानने में मदद करता है कि कुछ असंभव हुआ था।

आशा है ये मदद करेगा :)


2
assertडिबगिंग संदर्भ में उपयोगी है, लेकिन डिबगिंग संदर्भ के बाहर निर्भर नहीं होना चाहिए।
फ्लक्सिक्स

2

मेरी संक्षिप्त व्याख्या है:

  • assertAssertionErrorयदि अभिव्यक्ति झूठी है, तो उठाता है, अन्यथा बस कोड जारी रहता है, और यदि कोई अल्पविराम है तो वह जो भी होगा AssertionError: whatever after comma, और कोड के लिए निम्न हैं:raise AssertionError(whatever after comma)

इस बारे में संबंधित ट्यूटोरियल:

https://www.tutorialspoint.com/python/assertions_in_python.htm


उत्तर यह प्रदान करता है कि ए का उपयोग कैसे किया जाए assert, लेकिन जब उपयोग नहीं करना है (या उपयोग नहीं करना है) ए assert; यह भी ध्यान देने योग्य बात है कि एक assertविकलांग हो सकता है अगर __debug__यह है Falseउपयोगी होगा।
फ्लक्सिक्स

1

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

0

जैसा कि अन्य उत्तरों में लिखा गया है, 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विनिर्देश का प्रतिनिधित्व करने के लिए कोड में बयान डालते हैं , तो हम आशा कर सकते हैं कि आपने कार्यक्रम की गुणवत्ता में सुधार किया है क्योंकि गलत तर्क, गलत रिटर्न मान, एक वर्ग की गलत स्थिति ... की सूचना दी जाएगी।


-2

प्रारूप: मुखर अभिव्यक्ति [, तर्क] जब मुखर एक बयान का सामना करता है, तो पायथन अभिव्यक्ति का मूल्यांकन करता है। यदि कथन सत्य नहीं है, तो एक अपवाद उठाया जाता है (जोर)। यदि दावा विफल हो जाता है, तो पायथन तर्क के रूप में तर्क का उपयोग करता है। जोर-जबरदस्ती के अपवादों को किसी अन्य अपवाद की तरह पकड़ा जा सकता है और कोशिश-को छोड़कर बयान का उपयोग किया जा सकता है, लेकिन यदि संभाला नहीं जाता है, तो वे कार्यक्रम को समाप्त कर देंगे और ट्रेसबैक का उत्पादन करेंगे। उदाहरण:

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!    

-2
def getUser(self, id, Email):

    user_key = id and id or Email

    assert user_key

फ़ंक्शन कॉल में पैरामीटर पारित करने के लिए सुनिश्चित करने के लिए इस्तेमाल किया जा सकता है।


1
यह काम करेगा, लेकिन जो मैं समझता हूं, उपयोगकर्ता-इनपुट की जांच के लिए अभ्रक का उपयोग नहीं किया जाना चाहिए, क्योंकि उन्हें रन-टाइम पर बंद किया जा सकता है। यदि आप वास्तव में उपयोगकर्ता-इनपुट लागू या मान्य करना चाहते हैं, तो if not user_key: raise ValueError()यहां अंतिम 2 पैराग्राफ चेक की जांच करें: wiki.python.org/moin/UsingAssertionsEffectively
alp_989

assertइनपुट सत्यापन के लिए उपयोग नहीं किया जाना चाहिए क्योंकि या तो सत्यापन को बाहर निकाल दिया जाएगा यदि __debug__है False। गैर-डीबग उद्देश्यों के लिए अभिकथन का उपयोग करने के कारण लोग परिणामस्वरूप AssertionErrorएस को पकड़ सकते हैं, जो डिबगिंग को कम करने के बजाय अधिक कठिन बना सकता है।
फ्लक्सिक्स

-4
>>>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
>>> 

-4

मूल रूप से मुखर कीवर्ड का अर्थ यह है कि यदि स्थिति सही नहीं है, तो एक जोर के माध्यम से यह अजगर में उदाहरण के लिए जारी है।

कोड-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

2
कृपया अपने कोड को ठीक से प्रारूपित करें। यह भी, यह पिछले उत्तरों पर कैसे सुधार करता है?
c2huc2hu

क्या मेरे स्पष्टीकरण में कोई समस्या है?
ujjwal_bansal

आपके स्पष्टीकरण में मौजूदा उत्तरों में कुछ भी नहीं जोड़ा गया है, और खराब व्याकरण को पढ़ना मुश्किल है। यदि आप सवालों के जवाब तलाश रहे हैं, तो नए प्रश्नों को ब्राउज़ करने पर विचार करें।
c2huc2hu

प्रदान की जवाब इस सवाल का जवाब होता है कि कैसे एक का उपयोग करने के assertलिए, लेकिन जवाब नहीं देता जब उपयोग करने के लिए (या नहीं का उपयोग करें) एक assert
फ्लक्सिक्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.