python中的断言是一种调试工具,用来测试某一个断言条件。如果断言条件为真,则程序将继续正常执行,但是如果条件为假,那么就会引发AssertionError异常并且显示相关的错误信息。
使用断言来自动检测程序中的错误,让程序更可靠以及更易于调试。
断言举例
下面假设要用python构建在线商店,为了添加打折优惠券的功能,编写了下面这个apply_discount函数:
里面中的assert语句就是确保在任何情况下,通过该函数计算的折后价不低于0,也不会高于产品原价。
1 def apply_discount(product, discount): 2 price = int(product['price'] * (1.0 - discount)) 3 assert 0 <= price <= product['price'] 4 return price
shoes = {'name': 'Fancy Shoes', 'price': 14900} price = apply_discount(shoes, 0.25) print(price)
11175
上面的例子正常运行,可以计算出打折后的价格,如果discount=2时,会出现什么结果呢?
shoes = {'name': 'Fancy Shoes', 'price': 14900} price = apply_discount(shoes, 2) print(price)
输出结果如下:
1 Traceback (most recent call last): 2 File "C:/Desktop/test/main.py", line 9, in <module> 3 price = apply_discount(shoes, 2) 4 File "C:/Desktop/test/main.py", line 3, in apply_discount 5 assert 0 <= price <= product['price'] 6 AssertionError
可以看到触发了AssertionError.因为此时违反了函数中设置的断言条件
断言可以极大的加快调试工作的速度,并且从长远看来,程序也更加容易维护。
Python的断言语法
python的断言语法如下:
1 assert_stmt ::= "assert" expression1 ["," expression2]
其中,expression1是需要测试的条件,可选的expression2是错误消息,如果断言失败那么就显示该消息。在执行的时候,python解释器将每条断言语句大致转换成以下这些语句:
1 if __debug__: 2 if not expression1: 3 raise AssertionError(expression2)
这段代码有下面两个特征:
- 代码在检查断言条件之前,还会检查__debug__全局变量。这是一个内置的布尔标记,在一般情况下为真,若进行代码优化则为假。
- 还可以用expression2传递一个可选的错误消息,该消息将与回溯中的AssertionError一起显示,用来进一步简化调试。
断言总结:
Python断言语句是一种测试某个条件的调试辅助功能,可以作为程序的内部自检。
断言应该只用于帮助开发人员识别bug,不是用于处理运行时错误的机制。
设置解释器可以全局禁用断言。