返回介绍

建议8:利用 assert 语句来发现问题

发布于 2024-01-30 22:19:09 字数 1990 浏览 0 评论 0 收藏 0

断言(assert)在很多语言中都存在,它主要为调试程序服务,能够快速方便地检查程序的异常或者发现不恰当的输入等,可防止意想不到的情况出现。Python自1.5版本开始引入断言语句,其基本语法如下:

assert  expression1 ["," expression2]

其中计算expression 1的值会返回True或者False,当值为False的时候会引发AssertionError,而expression 2是可选的,常用来传递具体的异常信息。

来看一个简单的使用例子:

>>> x =1
>>> y =2
>>> assert x == y,"not equals"
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AssertionError: not equals
>>>

在执行过程中它实际相当于如下代码:

>>> x =1
>>> y =2
>>> if __debug__ and not x == y:
...   raise AssertionError("not equals")
...
Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
AssertionError: not equals
>>>

对Python中使用断言需要说明如下:

1)__debug__的值默认设置为True,且是只读的,在Python2.7中还无法修改该值。

2)断言是有代价的,它会对性能产生一定的影响,对于编译型的语言,如C/C++,这也许并不那么重要,因为断言只在调试模式下启用。但Python并没有严格定义调试和发布模式之间的区别,通常禁用断言的方法是在运行脚本的时候加上-O标志,这种方式带来的影响是它并不优化字节码,而是忽略与断言相关的语句。如:

def foo(x):
  assert x
foo(0)

运行python asserttest.py如下:

Traceback (most recent call last):
  File "asserttest.py", line 4, in <module>
  foo(0)
  File "asserttest.py", line 2, in foo
  assert x
AssertionError

加上-O的参数:python -O asserttest.py便可以禁用断言。

断言实际是被设计用来捕获用户所定义的约束的,而不是用来捕获程序本身错误的,因此使用断言需要注意以下几点:

1)不要滥用,这是使用断言最基本的原则。若由于断言引发了异常,通常代表程序中存在bug。因此断言应该使用在正常逻辑不可到达的地方或正常情况下总是为真的场合。

2)如果Python本身的异常能够处理就不要再使用断言。如对于类似于数组越界、类型不匹配、除数为0之类的错误,不建议使用断言来进行处理。下面的例子中使用断言就显得多余,因为如果传入的参数一个为字符串,另一个为数字或者列表,本身就会抛出TypeError。

>>> def stradd(x,y):
...   assert isinstance(x,basestring)
...   assert isinstance(y,basestring)
...   return x+y

3)不要使用断言来检查用户的输入。如对于一个数字类型,如果根据用户的设计该值的范围应该是2~10,较好的做法是使用条件判断,并在不符合条件的时候输出错误提示信息。

4)在函数调用后,当需要确认返回值是否合理时可以使用断言。

5)当条件是业务逻辑继续下去的先决条件时可以使用断言。如list1和其副本list2,业务继续下去的条件是这两个list必须是一样的,但由于某些不可控因素,如使用了浅拷贝而list1中含有可变对象等,就可以使用断言来判断这两者的关系,如果不相等,则继续运行后面的程序意义不大。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文