说明
《Python 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
Python assert 断言语句是将调试断言插入程序的便捷方式。可以把断言语句理解为一个 if 语语句,如果为真则继续往下执行,反之抛出 AssertionError 错误。它可以帮助我们判断代码逻辑是否正确,提早发现程序错误。
以下是为了方便理解的一些示例:
# 正常
assert 10
assert True
assert 1 > 0
# 抛出异常
assert 0
assert False
assert 1 > 2
assert len(range(3)) > 3
assert range(3) == [0,1,2]
# AssertionError:
# 提示语
assert 1==2, '1 不等于 2'
# AssertionError: 1 不等于 2
assert 1/0 # 此处不是断言的作用,表达式本身报错
# ZeroDivisionError: division by zero
当 assert 语句后的表达式值为真时,程序继续执行;否则报 AssertionError 错误,程序停止执行,及时止损。
assert 语句的语法结构为:
assert <表达式>
assert <表达式>, <错误提示语>
等价格于:
if __debug__:
if not expression: raise AssertionError
# 以及
if __debug__:
if not expression1: raise AssertionError(expression2)
以上等价形式假定 __debug__
和 AssertionError 指向具有指定名称的内置变量。在当前实现中,内置变量 __debug__
在正常情况下为 True,在请求优化时为 False (对应命令行选项为 -O
)。 如果在编译时请求优化,当前代码生成器不会为 assert 语句发出任何代码。
请注意不必在错误信息中包含失败表达式的源代码;它会被作为栈追踪的一部分被显示。
赋值给 __debug__
是非法的,该内置变量的值会在解释器启动时确定。
以下脚本:
# test.py
print(__debug__)
assert 0 > 1
当执行脚本 python test.py
时,__debug__
为 True,断言语句抛出 AssertionError 异常。
如果执行脚本 python -O test.py
时,__debug__
为 False,断言未执行,代码无异常。
检查先验条件使用断言,检查后验条件使用异常。就是说,在执行代码前要检查就是断言,在执行代码过程中,用异常。
以下是一些使用场景示例。
判断输入数字符合要求,否则报错。
number = int(input('请输入小于10的数字'))
# 断言
assert number < 10
print("输入正确!", number)
不支持 Python 版本判断:
import sys
assert sys.version_info.major==2, '不支持 Python 2'
# AssertionError: 不支持 Python 2
定义一个加法计算,检测数据类型:
def add(x, y):
assert isinstance(x, int|float), 'x数字格式不对!'
assert isinstance(y, int|float), 'y数字格式不对!'
return x + y
add(1,1.2) # 2.2
add('1', 1)
# AssertionError: x数字格式不对!
你可以写一个除法,让除数不能为 0。
read_file 函数在被调用执行后,依然需要满足一定条件,比如 file_path 所指定的文件需要是存在的,并且当前用户有权限读取该文件,这些条件称为后验条件,对于后验条件的检查,我们需要使用异常来处理。
def read_file(file_path):
assert isinstance(file_path, str)
if not check_exist(file_path):
raise FileNotFoundError()
if not has_privilege(file_path):
raise PermissionError()
文件不存在和没有权限,这两种情况并不属于代码 bug,是代码逻辑的一部分,上层代码捕获异常后可能会执行其他逻辑,因此我们不能接受这部分代码在生产环境中被忽略。并且,相比于 assert 语句只能抛出 AssertionError,使用异常可以抛出更细致的错误,方便上层代码针对不同错误执行不同的逻辑。
有时候你可能看到这样的写法:
assert(1>1)
# AssertionError:
assert(1>1), '1不大于1'
# AssertionError: 1不大于1
不要以为 assert 是内置函数,其实它的合规写法是:
assert 1>1, '1不大于1'
只不过给 assert 后的表达式加了圆括号而已。
这其实也和 Python 允许函数名后的调用括号可以有多个空格的语法一样:
def func():
print(123)
func ()
# 123
关键字语句后也可以用圆括号包起来,而不用空格:
if(1+1>0):
print(1)
# 1
这是人们经常使用括号进行符合 PEP 8 的隐式行延拓。
以上写法容易引起混淆,因此,我们要避免以上的写法。
更新时间:2022-08-12 08:56:01 标签:python assert 断言