91个建议系列之4-利用assert语句来发现问题

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

1、断言的基本语法

断言(assert)在很多语言中都存在,它主要为调试程序服务,能够快速方便地检查程序的异常或者发现不恰当的输入等,可防止意想不到的情况出现。以前你经常使用断点+print进行调试,但现在你有更简洁的语法来实现它:

# 断言更简洁:
assert x == y, "not equals"

# 传统调试print:
if x == y: print("not equal")

assert的基本语法就:

assert  expression1 ["," expression2]

如果表达式expression1的结果为True,则继续往下进行,如果为False会引发AssertionError,而expression 2是可选的,常用来传递具体的异常信息。assert在运行上等价于采用raise抛出异常:

if __debug__ and not x == y: 
	raise AssertionError("not equals")

使用断言要注意以下问题:

  • __debug__的值默认设置为True,且是只读的。

2、断言的禁用

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

python asserttest.py # 断言模式
python -O asserttest.py # 禁用断言

3、注意事项

断言实际是被设计用来捕获用户所定义的约束的,而不是用来捕获程序本身错误的,因此使用断言需要注意以下几点:
1)不要滥用,这是使用断言最基本的原则。若由于断言引发了异常,通常代表程序中存在bug。因此断言应该使用在正常逻辑不可到达的地方或正常情况下总是为真的场合。
2)如果Python本身的异常能够处理就不要再使用断言。如对于类似于数组越界、类型不匹配、除数为0之类的错误,不建议使用断言来进行处理。比如下面的例子,如果除数为0,本身python就会抛出ZeroDivisionError,使用assert毫无意义。

def mydivide(x,y):
    "返回x/y的值"
#     assert y!=0,'divider cannot be 0'
    return x/y
mydivide(1,0)

又或者类型不匹配

def myfun(s:str):
#     assert isinstance(s,str),"para should be str"
    return s.upper()
myfun([1,2,3])

如果输入不是列表,不用你断言系统就会抛出AttributeError。

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

assert 2<x<10,"range error"

4)在函数调用后,当需要确认返回值是否合理时可以使用断言。
5)当条件是业务逻辑继续下去的先决条件时可以使用断言。如list1和其副本list2,业务继续下去的条件是这两个list必须是一样的,但由于某些不可控因素,如使用了浅拷贝而list1中含有可变对象等,就可以使用断言来判断这两者的关系,如果不相等,则继续运行后面的程序意义不大。
6)断言用于非常特别的失败条件,如果这个错误经常出现,你就应该调整过代码,而不是用assert。你的用户绝不看到一个AssertionError,如果看到了,那就是个必须修复的缺陷

综上所述,assert适用于特别情况下的代码逻辑错误,其余情况下应该慎重使用,否则容易画蛇添足哦。

——End——
欢迎关注我的微信公众号
扫码关注公众号

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值