Python 利用assert语句发现问题
********************************************************************
*****摘自<编写高质量代码 改善Python程序的91个建议>*****
********************************************************************
断言(assert),主要用于调试程序,能够快速方便地检查程序的异常或者发现不恰当的输入,可防止意想不到的情况出现;
基本语法:assert expression1 ["," expression2]
其中计算expression1的值并返回True或False,当值为False时引发AssertionError;expression2为可选,常用于传递具体的异常信息。
1 >>> x = 1 2 >>> y = 2 3 >>> assert x==y, "not equals." 4 Traceback (most recent call last): 5 File "<stdin>", line 1, in <module> 6 AssertionError: not equals. 7 >>>
在执行过程中,它实际相当于如下代码:
1 >>> x = 1 2 >>> y = 2 3 >>> if __debug__ and not x == y: 4 ... raise AssertionError("not equals.") 5 ... 6 Traceback (most recent call last): 7 File "<stdin>", line 2, in <module> 8 AssertionError: not equals. 9 >>>
断言实际是被设计用来捕获用户所定义的约束的,而不是用来捕获程序本身的错误的,因此使用断言需要注意以下几点:
1)不要滥用,这是使用断言的最基本原则。若由于断言引发了异常,通常代表程序中存在bug。因此断言应该使用在正常逻辑处理不可达到的地方或正常情况下总为真的场合;
2)如果Python本身的异常能够处理就不要再使用断言。如对于类似于数组越界、类型不匹配、除数为0之类的错误,不建议使用断言来处理。例如下面这个例子,因为传入的参数一个为字符串,另一个为数字或列表,本身就会抛TypeError。
1 >>> def stradd(x,y): 2 ... assert isinstance(x, basestring) 3 ... assert isinstance(y, basestring) 4 ... return x + y 5 ... 6 >>>
3)不要使用断言来检查用户的输入。如对于一个数字类型,如果根据用户的设计该值的范围应该是2~10,较好的做法是使用条件判断,并在不符合条件的时候输出错误提示信息。
4)在函数调用后,当需要确认返回值是否合理是可以使用断言。
5)当条件是业务逻辑继续下去的先决条件时可以使用断言。如list1和其副本list2,业务继续下去的条件是两个list必须是一样的,但由于不可控因素,如使用了浅拷贝而list1中含有可变对象等,就可以使用断言来判断这两者的关系,如果不相等,则继续运行后面的程序意义也就不大了。