मैं पायथन में दावे को कैसे अक्षम करूं?
यही कारण है कि, अगर एक असफलता विफल हो जाती है, तो मैं नहीं चाहता कि इसे फेंक दिया जाए AssertionError
, लेकिन चलते रहना चाहिए।
मैं उसको कैसे करू?
जवाबों:
मैं पायथन में दावे को कैसे अक्षम करूं?
ऐसे कई दृष्टिकोण हैं जो किसी एकल प्रक्रिया, पर्यावरण या कोड की एकल पंक्ति को प्रभावित करते हैं।
मैं प्रत्येक को प्रदर्शित करता हूं।
-O
ध्वज (राजधानी O) का उपयोग करना एक प्रक्रिया में सभी मुखर बयानों को निष्क्रिय करता है।
उदाहरण के लिए:
$ python -Oc "assert False"
$ python -c "assert False"
Traceback (most recent call last):
File "<string>", line 1, in <module>
AssertionError
ध्यान दें कि निष्क्रिय होने से मेरा मतलब है कि यह उस अभिव्यक्ति को भी निष्पादित नहीं करता है जो इस प्रकार है:
$ python -Oc "assert 1/0"
$ python -c "assert 1/0"
Traceback (most recent call last):
File "<string>", line 1, in <module>
ZeroDivisionError: integer division or modulo by zero
आप इस ध्वज को सेट करने के लिए एक पर्यावरण चर का उपयोग कर सकते हैं।
यह पर्यावरण को उपयोग या विरासत में देने वाली हर प्रक्रिया को प्रभावित करेगा।
उदाहरण के लिए, विंडोज में, पर्यावरण चर को सेट करना और फिर साफ़ करना:
C:\>python -c "assert False"
Traceback (most recent call last):
File "<string>", line 1, in <module>
AssertionError
C:\>SET PYTHONOPTIMIZE=TRUE
C:\>python -c "assert False"
C:\>SET PYTHONOPTIMIZE=
C:\>python -c "assert False"
Traceback (most recent call last):
File "<string>", line 1, in <module>
AssertionError
यूनिक्स में समान ( संबंधित कार्यक्षमता के लिए सेट और अनसेट का उपयोग करके )
आप अपना प्रश्न जारी रखें:
यदि एक जोरदार विफल रहता है, मैं नहीं चाहता कि यह एक जोर फेंकना है, लेकिन जा रहा रखने के लिए।
यदि आप चाहते हैं कि कोड जो व्यायाम करने में विफल रहता है, तो आप उदाहरण के लिए नियंत्रण प्रवाह को सुनिश्चित करने के लिए या तो पकड़ सकते हैं, उदाहरण के लिए:
if False:
assert False, "we know this fails, but we don't get here"
या आप दावे को पकड़ सकते हैं:
try:
assert False, "this code runs, fails, and the exception is caught"
except AssertionError as e:
print(repr(e))
जो प्रिंट करता है:
AssertionError('this code runs, fails, and the exception is caught')
और तुम उस बिंदु से चलते रहोगे जिसे तुमने संभाला है AssertionError
।
इस तरह एक जोरदार बयान:
assert expression #, optional_message
के बराबर है
if __debug__:
if not expression: raise AssertionError #(optional_message)
तथा,
अंतर्निहित वैरिएबल
__debug__
हैTrue
सामान्य परिस्थितियों में,False
जब अनुकूलन अनुरोध किया जाता है (आदेश पंक्ति विकल्प-O
)।
और आगे
असाइनमेंट
__debug__
अवैध हैं। इंटरप्रेटर शुरू होने पर अंतर्निहित चर के लिए मूल्य निर्धारित किया जाता है।
उपयोग डॉक्स से:
बुनियादी अनुकूलन चालू करें। यह .pyc से .pyo तक संकलित (बाइटकोड) फ़ाइलों के लिए फ़ाइल नाम एक्सटेंशन को बदलता है। PYTHONOPTIMIZE भी देखें।
तथा
यदि यह एक गैर-खाली स्ट्रिंग पर सेट है, तो यह
-O
विकल्प को निर्दिष्ट करने के बराबर है । यदि पूर्णांक पर सेट किया जाता है, तो यह-O
कई बार निर्दिष्ट करने के बराबर है ।
if False: assert False
) या आप जोर त्रुटि को पकड़ सकते हैं। वो आपकी पसंद हैं। अपने प्रश्न का उत्तर देने के लिए अद्यतन करें।
foo()
और एस्सरेशन को स्विच ऑफ करना with skip_assertion(): foo()
। इसका फायदा यह हो रहा है कि मुझे समारोह में एक और झंडा नहीं जोड़ना है
Assert
वस्तुओं के साथ Pass
वस्तुओं को बदलें )। एक संदर्भ प्रबंधक इसके लिए सीधे काम नहीं करेगा, लेकिन आपके पास किसी तरह का तंत्र हो सकता है जो उस तरह से सजाए गए कार्यों का उपयोग करता है। बावजूद, मैं इसकी सिफारिश नहीं करता। मुझे आपके ऐसा करने की इच्छा के कारण पर संदेह है कि क्या आप ऐसे कोड को कॉल कर रहे हैं जिन्हें आप नियंत्रित नहीं करते हैं और AsorionErrors प्राप्त कर रहे हैं। यदि हां, तो आपको एक अलग फिक्स खोजने की आवश्यकता है।
-O ध्वज के साथ अजगर को बुलाओ:
test.py:
assert(False)
print 'Done'
आउटपुट:
C:\temp\py>C:\Python26\python.exe test.py
Traceback (most recent call last):
File "test.py", line 1, in <module>
assert(False)
AssertionError
C:\temp\py>C:\Python26\python.exe -O test.py
Done
पहले से दिए गए दो उत्तर दोनों मान्य हैं (पायथन को या तो -O
या -OO
कमांड लाइन पर कॉल करें )।
यहाँ उनके बीच अंतर है:
-O
बुनियादी अनुकूलन चालू करें। यह .pyc से .pyo तक संकलित (बाइटकोड) फ़ाइलों के लिए फ़ाइल नाम एक्सटेंशन को बदलता है।
-OO
त्यागें docstrings अलावा करने के लिए -O
अनुकूलन।
( पायथन प्रलेखन से )
उपयोग करें python -O
:
$ python -O
>>> assert False
>>>
आपको (अधिकांश) दावे को अक्षम नहीं करना चाहिए । जब ध्यान कहीं और होता है तो वे अप्रत्याशित त्रुटियों को पकड़ लेते हैं। नियम 5 को "दस की शक्ति" में देखें ।
इसके बजाय, कुछ महंगी जाँचों को सुरक्षित रखें:
import logging
logger = logging.getLogger(__name__)
if logger.getEffectiveLevel() < logging.DEBUG:
ok = check_expensive_property()
assert ok, 'Run !'
महत्वपूर्ण assert
विवरण रखने का एक तरीका, और बयानों को अनुकूलित करने की अनुमति देना उन्हें चयन विवरण के भीतर उठाकर है:
if foo_is_broken():
raise AssertionError('Foo is broken!')
__debug__
झूठा करने की कोशिश की, लेकिन इसकी अनुमति नहीं है।