10.7 断言

断言是一句必须等价于布尔真的判定;此外,发生异常也意味着表达式为假。这些工作类似于C语言预处理器中assert宏,但在Python中它们在运行时构建(与之相对的是编译期判别)。

如果你刚刚接触断言这个概念也没有关系。断言可以简简单单的想象为raise-if语句(更准确的说是raise-if-not语句)。测试一个表达式,如果返回值是假,触发异常。

断言通过assert语句实现,在1.5版中引入。

断言语句

断言语句等价于这样的Python表达式,如果断言成功不采取任何措施(类似语句),否则触发AssertionError(断言错误)的异常.assert的语法如下:

10.7 断言 - 图1

下面有一些演示assert用法的语句:

10.7 断言 - 图2

AssertionError异常和其他的异常一样可以用try-except语句块捕捉,但是如果没有捕捉,它将终止程序运行而且提供一个如下的跟踪记录:

10.7 断言 - 图3

如同先前章节我们研究的raise语句,我们可以提供一个异常参数给我们的assert命令:

10.7 断言 - 图4

下面是我们如何用try-except语句捕获AssertionError异常:

10.7 断言 - 图5

从命令行执行上面的代码会导致如下的输出:

10.7 断言 - 图6

为了让你更加了解assert如何运作,想象一下断言语句在Python中如何用函数实现。可以像下面这样:

10.7 断言 - 图7

此处的if语句检查assert的语法是否合适,也就是expr必须是一个表达式。我们比较expr的类型和真正的表达式来确认。函数的第二部分对表达式求值然后根据结果选择性的引发异常。内建的变量_debug在通常情况下为True,如果开启优化后为False(命令行选项-O)(Python 2.2后为布尔值True和False)。