Python | assert的使用

发布时间 2023-06-07 18:35:33作者: 张Zong在修行

如果你在看python代码的时候,会在一些代码中看到assert关键字的语句。本文重点介绍Assert语句的作用以及什么时候应该使用该语句。

什么是断言

  • 程序运行过程中,所有变量的当前值组合构成了“状态”;
  • 每执行一段程序,状态就发生变化;
  • 如果程序有逻辑错误的bug,必定在某处变量值的组合不符合预期,处于错误状态;
  • 将对变量的预期写为断言,可以定位复杂的逻辑错误

assert语句的基础语法

基于语法:

assert <表达式>[,<打印信息>]

​ 上述语句,如果表达式为True,assert语句不会产生任何效果,我们可以像往常一样继续往下执行。如果表达式为False,程序终止,AssertionError,并显示<打印信息>。

Traceback (most recent call last):
  File "/your/path/a.py", line 2, in <module>
    assert False
AssertionError

不加打印信息的assert的使用

例一:寻找一个列表中的最小值

# 断言的例子: 最小值 
alist = [23,12,33,55]
amin = min(alist)
# 列表中最小值: 列表中的数,不大于任何一个数
assert amin in alist and all(amin <= x for x in alist)
print("min=",amin)

​ 上述代码中,语句assert amin in alist and all(amin <= x for x in alist)主要用于检查amin是不是列表中的数并且不大于列表中任何一个数。如果不满足上述条件,则会发生断言错误并停止运行程序。

例二:判断是否是排好序的列表

# 断言的例子:排好序的列表
alist = [12,34,56,78,73]
# 排好序的列表:任何一个数都不会超过它的下一个数
assert all(alist[i] <= alist[i+1] for i in range(len(alist)-1))
print("sorted:",alist)

​ 上述代码中,语句assert all(alist[i] <= alist[i+1] for i in range(len(alist)-1))主要用于检查alist列表中任何一个数都不会超过它的下一个数。如果不满足上述条件(也就是alist列表没有排好序),则会发生断言错误并停止运行程序。

加打印信息的assert的使用

更进一步,我们可以添加断言消息,该消息与断言错误一起显示。

# 断言的例子: 与类型注解配合
def half(n: int) -> int:
	assert isinstance(n,int),"参数n必须是整数"
    return n // 2
print(half(12))
print(half(1.2)) # 其它部分错误使用了half,或者参数错置

输出结果:

6

---------------------------------------------------------------------------
AssertionError                            Traceback (most recent call last)
~\AppData\Local\Temp\ipykernel_2268\2357812243.py in <module>
----> 1 print(half(1.2))

~\AppData\Local\Temp\ipykernel_2268\475170792.py in half(n)
      1 def half(n: int) -> int:
----> 2     assert isinstance(n,int),"参数n必须是整数"
      3     return n // 2

AssertionError: 参数n必须是整数

​ 上述代码中,语句assert isinstance(n,int),"参数n必须是整数"主要用于检查参数n必须是整数。如果不满足上述条件(也就是half函数参数错置),则会发生断言错误并停止运行程序。

什么时候用/不用断言

  • assert语句是一种调试程序的手段,仅用于定位可能的错误;

  • 断言不能视作算法的一部分;

    • 删去所有的assert语句也不影响程序功能和特性
  • try语句提高程序健壮性,assert不能;

  • 程序正式运行可以跳过所有assert语句

    • python -o main.py