【Python】Python 利用 assert 语句来发现问题

Python 利用 assert 语句来发现问题

1、利用 assert 语句来发现问题

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

assert expression1 "," expression2

其中计算 expression 1 的值会返回 True 或者 False , 当值为 False 的时候会引发程序异常; 第二个参数是可选的,常用来传递具体的异常信息。

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

x =1

y =2

assert x == y


AssertionError Traceback (most recent call last)

in ()

1 x =1

2 y =2

----> 3 assert x == y

AssertionError:

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

x =1

y =2

if debug and not x == y:

raise AssertionError("not equals")

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

debug 的值默认设置为 True , 且是只读的。 在Pyth〇n2.7中还无法修改该值。

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

def foo(x):

assert x

foo(0)

运行 python asserttest py 如 F:

! python3 asserttest.py

Traceback (most recent call last):

File "/home/bk/jubook/book-wim/book-python/_aref/jubook_tips/ch02_guanyong/asserttest.py", line 3, in

foo(0)

File "/home/bk/jubook/book-wim/book-python/_aref/jubook_tips/ch02_guanyong/asserttest.py", line 2, in foo

assert x

^^^^^^^^

AssertionError

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

2. 断言使用的一些原则

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

不要滥用,这是使用断言最基本的原则。

若由于断言引发了异常,通常代表程序中存在Bug。 因此断言应该使用在正常逻辑不可到达的地方或正常情况下总是为真的场合。

如果Python本身的异常能够处理就不要再使用断言。

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

def stradd(xry):

assert isinstance(x,basestring)

assert isinstance(y,basestring)

return x+y

不要使用断言来检査用户的输入。

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

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

当条件是业务逻辑继续下去的先决条件时可以使用断言.

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

相关推荐
无限的鲜花6 小时前
反射(原创推荐)
java·开发语言
hhzz6 小时前
基于监控视频的水位尺自动识别技术方案与实现
python·opencv·yolo·图像识别·cv
yongche_shi6 小时前
ragas官方文档中文版(五十)
开发语言·python·ai·ragas·如何评估和改进 rag 应用
一路向北he6 小时前
字节钢铁军团--“提供情境,而非控制”
java·开发语言·前端
weixin_408099677 小时前
OCR批量识别图片方案:从手动处理到自动化API系统(Python/Java/PHP实战)
图像处理·python·ocr·文字识别·api调用·批量识别·石榴智能
AI行业学习8 小时前
Notepad++ 官方下载 + 完整安装 + 全套优化配置(2026最新)
开发语言·人工智能·python·前端框架·html·notepad++
大圣编程8 小时前
Python中continue语句的用法是什么?
开发语言·前端·python
云烟成雨TD9 小时前
LangFlow 1.x 系列【5】可视化编辑页面功能说明
人工智能·python·agent
upgrador9 小时前
基础知识:C++ STL构造函数的左闭右开惯例及其实现原理
开发语言·c++
yoothey10 小时前
报废审批流规则引擎设计——责任链模式完整实现
linux·开发语言·bash