在昨天的文章中(零基础学习 Python 之处理异常)中学习了处理异常的正确姿势,今天我们继续来学习“错误 & 异常”里比较重要的一个知识点:「assert」。

assert 翻译成中文就是「断言」的意思,它是一句等价于布尔真的判断,如果它发生异常的话,意味着表达式为假。

断言(assert)

首先让我们先来看点简单的代码,从代码中理解 assert。

>>> assert 'a' == 'a'
>>> assert 'a' == 'b'
Traceback (most recent call last):
File "", line 1, in 
AssertionError

assert 的应用场景很像它在汉语中的意思:当程序运行到某个节点的时候,就断定某个变量的值必然是什么,或者是对象必然拥有某个属性等。简单点来说的话,就是断定是什么东西就必然是什么东西,如果不是,就抛出异常。

接下来我们再来看一段稍微复杂点的代码:

class Account(object):
def __init__(self,num):
self.number = num
self.cnt = 0
def deposit(self,amount):
try:
assert amount > 0
self.cnt += amount
except:
print('the amount can not be zero.')
def withdraw(self,amount):
assert amount > 0
if amount <= self.cnt:
self.cnt -= amount
else:
print('cnt is not enough')

在上面的代码中,我们设置的是 deposit() 和 withdraw() 方法的参数 amount 必须大于零,这里用的就是断言,如果不满足条件的话就会直接报错。比如像下面这样来运行:

if __name__ == "__main__":
a = Account(100)
a.deposit(-10)

出现的结果如下所示:

the amount can not be zero.

这就是断言 assert 的引用,那么什么时候是引用断言的最佳时机呢?如果没有特殊的目的的话,断言主要应用于以下情况(参考《Python使用断言的最佳时机》):

1.防御性的编程;

2.运行时对程序逻辑的检测;

3.合约性检查(比如前置或者后置条件);

4.程序中的常量;

5.检查文档。

写在之后

assert 就这些东西,「错误 & 异常」到这差不多就结束了。异常处理是编程语言或者计算机硬件里的一种机制,用于处理软件或信息系统中出现的异常状况。

通过异常处理,我们可以对用户在程序中的非法输入进行控制和提示,以防程序崩溃。从进程的视角来看,硬件终端属于可恢复异常,虽然异常一般与程序流本身无关。

异常是一种很有用的机制,用于通知外界该子程序不能正常执行,比如输入的数据无效或者所需的资源不可用等,如果系统没有异常机制,则程序员需要用返回值来标示发生了哪些错误。

The end。