Python 中的断言( assert )
Python 中的断言( assert )
Python 中的断言( assert )
由Python 文档https://docs.python.org/3/reference/simple_stmts.html#assert 可知,assert 语句的语法如下所示:
assert_stmt ::= “assert” expression1 [“,” expression2]
此乃编译原理的定义格式,通俗说法为:
assert expression1 [, expression2]
其中expression1是需要测试的条件, expression2是错误消息是可选的,测试的条件为假时显示之。在执行时,Python 解释器将每条断言语句大致转换为以下这些语句:
if __debug__:
if not expression1:
raise AssertionError(expression2)
需要说明两点:
*,代码在检查断言条件之前,还会检查__debug__全局变量。这是一个内置的布尔标记,,内置变量 __debug__ 在正常情况下为 True。
第二,当expression1为真时,程序继续往下执行,只是判断,不做任何处理;
当expression1为假时,中断程序,抛出AssertionError错误,并将expression2消息输出。
例1、
def foo(s):
n = int(s)
assert n != 0, ‘n is zero!’
return 10 / n
print(foo(‘2’)) #程序不报错,将该句改为print(foo(‘0’)) # 代码执行结果, AssertionError: n is zero!
例2、本例演示了用try语句捕获assert抛出异常,代码如下:
def testAssert():
for i in range(4):
try:
assert i<2
except AssertionError:
print(‘捕获assert抛出的异常!’)
print(i)
print(‘……end……’)
testAssert()
本例中定义了testAssert函数,当for循环变量i为2时,assert后的条件i<2为假,因此抛出AssertionError,因为这个异常被捕获处理,程序不会中断,直至for循环正常结束。
运行效果如下:
0
1
捕获assert抛出的异常!
2
捕获assert抛出的异常!
3
……end……
如何禁用Python中的断言?怎么做?
断言语句是可以被禁用的——需要满足__debug__ == flase,可以这样做:
若在命令行中使用-O 和-OO 标识,或修改Python 中的PYTHONOPTIMIZE环境变量,都会全局禁用断言。
如,,在命令行中使用-O标志(大写字母O)调用Python运行scriptName.py :
python -O scriptName.py
关于__debug__可参见https://docs.python.org/zh-cn/3/library/constants.html?highlight=__debug__#__debug__