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__