当前位置:   article > 正文

【Python 基础篇】Python中的assert 断言_python内置函数 assert

python内置函数 assert

Assert 语法

assert 语句的语法结构为:

  1. assert <表达式>
  2. assert <表达式>, <错误提示语>

等价于:

  1. if __debug__:
  2. if not expression: raise AssertionError
  3. # 以及
  4. if __debug__:
  5. if not expression1: raise AssertionError(expression2)

以上等价形式假定 __debug__ 和 AssertionError 指向具有指定名称的内置变量。在当前实现中,内置变量 __debug__ 在正常情况下为 True,在请求优化时为 False (对应命令行选项为 -O)。 如果在编译时请求优化,当前代码生成器不会为 assert 语句发出任何代码。

请注意不必在错误信息中包含失败表达式的源代码;它会被作为栈追踪的一部分被显示。

赋值给 __debug__ 是非法的,该内置变量的值会在解释器启动时确定。

以下脚本:

  1. # test.py
  2. print(__debug__)
  3. assert 0 > 1

当执行脚本 python test.py 时,__debug__ 为 True,断言语句抛出 AssertionError 异常。

如果执行脚本 python -O test.py 时,__debug__ 为 False,断言未执行,代码无异常。

实用举例

以下是为了方便理解的一些示例:

  1. # 正常
  2. assert 10
  3. assert True
  4. assert 1 > 0
  5. # 抛出异常
  6. assert 0
  7. assert False
  8. assert 1 > 2
  9. assert len(range(3)) > 3
  10. assert range(3) == [0,1,2]
  11. # AssertionError:
  12. # 提示语
  13. assert 1==2, '1 不等于 2'
  14. # AssertionError: 1 不等于 2
  15. assert 1/0 # 此处不是断言的作用,表达式本身报错
  16. # ZeroDivisionError: division by zero

当 assert 语句后的表达式值为真时,程序继续执行;否则报 AssertionError 错误,程序停止执行,及时止损。

经典案例

检查先验条件使用断言,检查后验条件使用异常。就是说,在执行代码前要检查就是断言,在执行代码过程中,用异常。

以下是一些使用场景示例。

判断输入是否正确

判断输入数字符合要求,否则报错。

  1. number = int(input('请输入小于10的数字'))
  2. # 断言
  3. assert number < 10
  4. print("输入正确!", number)

Python 版本判断

不支持 Python 版本判断:

  1. import sys
  2. assert sys.version_info.major==2, '不支持 Python 2'
  3. # AssertionError: 不支持 Python 2

函数参数合法性检测

定义一个加法计算,检测数据类型:

  1. def add(x, y):
  2. assert isinstance(x, int|float), 'x数字格式不对!'
  3. assert isinstance(y, int|float), 'y数字格式不对!'
  4. return x + y
  5. add(1,1.2) # 2.2
  6. add('1', 1)
  7. # AssertionError: x数字格式不对!

你可以写一个除法,让除数不能为 0。

读取文件函数

read_file 函数在被调用执行后,依然需要满足一定条件,比如 file_path 所指定的文件需要是存在的,并且当前用户有权限读取该文件,这些条件称为后验条件,对于后验条件的检查,我们需要使用异常来处理。

  1. def read_file(file_path):
  2. assert isinstance(file_path, str)
  3. if not check_exist(file_path):
  4. raise FileNotFoundError()
  5. if not has_privilege(file_path):
  6. raise PermissionError()

文件不存在和没有权限,这两种情况并不属于代码 bug,是代码逻辑的一部分,上层代码捕获异常后可能会执行其他逻辑,因此我们不能接受这部分代码在生产环境中被忽略。并且,相比于 assert 语句只能抛出 AssertionError,使用异常可以抛出更细致的错误,方便上层代码针对不同错误执行不同的逻辑。

其他

有时候你可能看到这样的写法:

  1. assert(1>1)
  2. # AssertionError:
  3. assert(1>1), '1不大于1'
  4. # AssertionError: 1不大于1

不要以为 assert 是内置函数,其实它的合规写法是:

assert 1>1, '1不大于1'

只不过给 assert 后的表达式加了圆括号而已。

这其实也和 Python 允许函数名后的调用括号可以有多个空格的语法一样:

  1. def func():
  2. print(123)
  3. func ()
  4. # 123

关键字语句后也可以用圆括号包起来,而不用空格:

  1. if(1+1>0):
  2. print(1)
  3. # 1

这是人们经常使用括号进行符合 PEP 8 的隐式行延拓。

以上写法容易引起混淆,因此,我们要避免以上的写法。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/559960
推荐阅读
相关标签
  

闽ICP备14008679号