ฉันจะปิดใช้งานการยืนยันใน Python ได้อย่างไร
นั่นคือถ้าการยืนยันล้มเหลวฉันไม่ต้องการให้มันโยนAssertionError
แต่จะทำต่อไป
ฉันจะทำอย่างไร?
ฉันจะปิดใช้งานการยืนยันใน Python ได้อย่างไร
นั่นคือถ้าการยืนยันล้มเหลวฉันไม่ต้องการให้มันโยนAssertionError
แต่จะทำต่อไป
ฉันจะทำอย่างไร?
คำตอบ:
ฉันจะปิดใช้งานการยืนยันใน Python ได้อย่างไร
มีหลายวิธีที่ส่งผลต่อกระบวนการเดียวสภาพแวดล้อมหรือโค้ดบรรทัดเดียว
ฉันสาธิตแต่ละ
การใช้-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
คุณสามารถใช้ตัวแปรสภาพแวดล้อมเพื่อตั้งค่าสถานะนี้ได้เช่นกัน
สิ่งนี้จะส่งผลต่อทุกกระบวนการที่ใช้หรือสืบทอดสภาพแวดล้อม
เช่นใน Windows ตั้งค่าแล้วล้างตัวแปรสภาพแวดล้อม:
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
เหมือนกันใน Unix (ใช้ set และunsetสำหรับฟังก์ชันการทำงานที่เกี่ยวข้อง)
คุณตั้งคำถามต่อไป:
ถ้าการยืนยันล้มเหลวฉันไม่ต้องการให้มันโยน 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__
เป็นสิ่งผิดกฎหมาย ค่าสำหรับตัวแปรบิวท์อินจะถูกกำหนดเมื่อล่ามเริ่มทำงาน
จากเอกสารการใช้งาน:
เปิดการเพิ่มประสิทธิภาพพื้นฐาน สิ่งนี้เปลี่ยนนามสกุลไฟล์สำหรับไฟล์ที่คอมไพล์ (bytecode) จาก. pyc เป็น. pyo โปรดดู PYTHONOPTIMIZE
และ
หากตั้งค่าเป็นสตริงที่ไม่ว่างจะเท่ากับการระบุ
-O
อ็อพชัน หากตั้งค่าเป็นจำนวนเต็มจะเท่ากับการระบุ-O
หลาย ๆ ครั้ง
if False: assert False
) หรือคุณสามารถตรวจจับข้อผิดพลาดในการยืนยัน นี่คือทางเลือกของคุณ อัปเดตคำตอบเพื่อตอบคำถามของคุณ
foo()
with skip_assertion(): foo()
ประโยชน์ของสิ่งนี้ที่ฉันไม่ต้องเพิ่มแฟ
Assert
วัตถุด้วยPass
วัตถุ) ตัวจัดการบริบทจะไม่ทำงานโดยตรงสำหรับสิ่งนั้น แต่คุณสามารถมีกลไกบางอย่างที่ใช้ฟังก์ชันตกแต่งในลักษณะนั้น ไม่ว่าฉันจะไม่แนะนำ ฉันสงสัยว่าเหตุผลของคุณที่ต้องการทำเช่นนั้นคือคุณกำลังเรียกรหัสที่คุณไม่ได้ควบคุมและได้รับ AssertionErrors หากเป็นเช่นนั้นคุณอาจต้องหาวิธีแก้ไขอื่น
เรียก Python ด้วยแฟล็ก -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
คำตอบทั้งสองคำตอบนั้นถูกต้อง (เรียก Python ด้วยบรรทัดคำสั่งอย่างใดอย่างหนึ่ง-O
หรือ-OO
ในบรรทัดคำสั่ง)
นี่คือความแตกต่างระหว่างพวกเขา:
-O
เปิดการเพิ่มประสิทธิภาพพื้นฐาน สิ่งนี้เปลี่ยนนามสกุลไฟล์สำหรับไฟล์ที่คอมไพล์ (bytecode) จาก. pyc เป็น. pyo
-OO
ทิ้ง docstrings นอกเหนือจากการปรับให้-O
เหมาะสม
(จากเอกสาร Python )
ใช้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!')
การทำงานในโหมดปรับให้เหมาะสมควรทำดังนี้
python -OO module.py
__debug__
เป็น False แต่ไม่ได้รับอนุญาต