Python assert(断言)用于判断一个表达式,在表达式条件为 false 的时候触发异常。
断言可以在条件不满足程序运行的情况下直接返回错误,而不必等待程序运行后出现崩溃的情况,例如我们的代码只能在 Linux 系统下运行,可以先判断当前系统是否符合条件。
语法格式如下:
assert expression
等价于:
if not expression: raise AssertionError
assert 后面也可以紧跟参数:
assert expression [, arguments]
等价于:
if not expression: raise AssertionError(arguments)
>>> assert True # 条件为 true 正常执行
>>> assert False # 条件为 false 触发异常
Traceback (most recent call last):
File "", line 1, in
AssertionError
>>> assert 1==1 # 条件为 true 正常执行
>>> assert 1==2 # 条件为 false 触发异常
Traceback (most recent call last):
File "", line 1, in
AssertionError
>>> assert 1==2, '1 不等于 2'
Traceback (most recent call last):
File "", line 1, in
AssertionError: 1 不等于 2
>>>
assert expression
用来让程序测试这个expression,如果expression为false,那么raise一个AssertionError出来。
>>> assert 1==1
>>> assert 1==0
Traceback (most recent call last):
File "", line 1, in
assert 1==0
AssertionError
>>> assert True
>>> assert False
Traceback (most recent call last):
File "", line 1, in
assert False
AssertionError
>>> assert 3<2
Traceback (most recent call last):
File "", line 1, in
assert 3<2
AssertionError
注意:assert 在 Python 3 中只是声明,不能写成下面形式:
assert(False, "Error")
这种形式,断言将永远不会被触发。因为此时 assert
的 expression
参数是内容为 (.., ..)
的 Tuple
,而 Tuple
只有在内容为空的时候才会被判断为 False
。
>>> assert len(lists) >=5,'列表元素个数小于5'
Traceback (most recent call last):
File "D:/Data/Python/helloworld/helloworld.py", line 1, in
assert 2>=5,'列表元素个数小于5'
AssertionError: 列表元素个数小于5
>>> assert 2==1,'2不等于1'
Traceback (most recent call last):
File "D:/Data/Python/helloworld/helloworld.py", line 1, in
assert 2==1,'2不等于1'
AssertionError: 2不等于1
首先,要知道Python解释器在运行时有两种模式:
__debug__
为True。-O
运行时,即python.exe -O demo.py
为优化模式,内置只读变量__debug__
为False。a=1
b=-1
assert a > 0 and b > 0
print('Game Over')
分别使用两种模式运行该文件,先来看正常的调试模式:
$ python demo5.py
Traceback (most recent call last):
File "demo5.py", line 3, in
assert a > 0 and b > 0
^^^^^
AssertionError
此时上述Python文件在调试模式下,触发了assert条件执行,并引发AssertionError
异常。
再来看优化模式:
$ python -O demo5.py
Game Over
在调优模式下,断言语句被禁用。
在调优模式下,在一定程度上提高了程序执行效率,但是这相当于埋下了一颗雷。
那么我们应该什么时候应该使用断言呢?一般的,如果没有特别的目的,断言应该用于:
当然,一些情况下,也不建议使用断言:
AssertionError
异常。在没完善一个程序之前,我们不知道程序在哪里会出错,与其让它在运行最崩溃,不如在出现错误条件时就崩溃。
这时,就要用到断言assert了,Python中的断言语句格式用法很简单。
断言 assert 是指期望用户指定的条件满足,它是当用户定义的约束条件不满足时触发AssertionError
异常,因此 assert 语句可以视为条件式的 raise 语句。它的主要功能是帮助程序员调试程序,从而保证程序运行的准确性,一般在开发调试阶段使用。
assert的一般用法
assert condition
assert判断条件(condition)是否成立,如果不成立,则抛出异常,逻辑上等同于:
if not condition:
raise AssertionEerror()
a = ''
# assert a
if not a:
raise AssertionError('a等于空')
assert的另一种形式
assert condition, expression
如果condition为False,就raise一个描述为expression的AssertionError的错误出来,逻辑上等同于:
if not condition:
raise AssertionEerror(expression)
a = ''
# assert a, 'a是空的啦'
if not a:
raise AssertionError('a等于空')
首先,要知道Python解释器在运行时有两种模式:
__debug__
为True。-O
运行时,即python.exe -O demo.py
为优化模式,内置只读变量__debug__
为False。a = ''
# assert a, 'a是空的啦'
if not a:
raise AssertionError('a等于空')
我们分别使用两种模式运行该文件,先来看正常的调试模式:
M:\>python testsss.py
Traceback (most recent call last):
File "testsss.py", line 56, in
assert a, 'a是空的啦'
AssertionError: a是空的啦
此时上述Python文件在调试模式下,触发了assert条件执行,并引发AssertionError
异常。
再来看优化模式:
M:\>python -O testsss.py
Traceback (most recent call last):
File "testsss.py", line 59, in
raise AssertionError('a等于空')
AssertionError: a等于空
由报错内容可以发现,在调优模式下,断言语句被禁用,报错语句是我们手写if判断引发的。
在调优模式下,在一定程度上提高了程序执行效率,但是这相当于埋下了一颗雷。
那么我们应该什么时候应该使用断言呢?一般的,如果没有特别的目的,断言应该用于:
当然,一些情况下,也不建议使用断言:
AssertionError
异常。默认的,__debug__
是常量,包括None、False、True这些常量不能重新赋值(即使作为属性名赋值给它们,也会引发SyntaxError
),因此可以将它们视为“True”常量。
if __debug__:
print('debug模式')
关于-O
,在命令行的环境下,使用python.exe -O demo.py
时,将会删除(可以理解为忽略)assert语句和任何基于__debug__
值的代码。详见PEP 488。
关于-OO
,在命令行的环境下,使用python.exe -OO demo.py
时,将会丢弃文档字符串。详见PEP 488。
def foo():
""" docstrings """
pass
if __debug__:
help(foo)
上述代码,使用python.exe demo.py
会返回foo函数的文档信息。而使用python.exe -OO demo.py
后,foo函数的文档信息将不会返回。