1 python异常之assert语句
python的assert语句,是一个断言语句。
用于断言某个表达式的值是否符合预期,不符合则停止运行,并且触发AssertionError异常。
1.1 基本用法
用法
assert test_cond [,err_msg]
复制
描述
test_cond:要测试的条件或表达式,test_condition;
err_msg:可选的错误消息;
断言test_cond是否为真,如果为假,则断言失败,触发AssertionError,显示错误消息。
示例
>>> def testassert(x):
print('x=',x)
assert x >= 0,'x必须大于等于0'
print('输入正确')
>>> testassert(9555)
x= 9555
输入正确
>>> testassert(-9)
x= -9
Traceback (most recent call last):
File "<pyshell#19>", line 1, in <module>
testassert(-9)
File "<pyshell#17>", line 3, in testassert
assert x >= 0,'x必须大于等于0'
AssertionError: x必须大于等于0
复制
1.2 assert等效于raise AssertionError
用法
if __debug__:
if not test_cond:
raise AssertionError([err_msg])
复制
描述
assert test_cond [,err_msg]等效写法如上面。
即assert断言语句是raise AssertionError的简写。
debug:内置变量,默认为True;
AssertionError:内置异常;
示例
>>> def testassert(x):
print('x=',x)
print('__debug__ =',__debug__)
if __debug__:
if not x >= 0:
raise AssertionError('x必须大于等于0')
print('输入正确')
>>> testassert(9555)
x= 9555
__debug__ = True
输入正确
>>> testassert(-9)
x= -9
__debug__ = True
Traceback (most recent call last):
File "<pyshell#24>", line 1, in <module>
testassert(-9)
File "<pyshell#22>", line 6, in testassert
raise AssertionError('x必须大于等于0')
AssertionError: x必须大于等于0
复制
1.3 关闭assert
用法
python -O xxx.py
复制
描述
命令行执行python文件时,用-O参数,关闭assert语句的执行,或者使得__debug__为False。
示例
testassert.py
1 import sys
2 def testassert(x):
3 print('您输入的是:',x)
4 assert int(x) >= 0,'输入的数必须大于等于0'
5 print('输入正确')
6
7 if __name__ == '__main__':
8 print('sys.argv =',sys.argv)
9 testassert(sys.argv[1])
复制
在cmd用命令行执行
# 输入正确,不用-O ,会执行 assert 语句
D:\python39>python E:\documents\F盘\testassert.py 9555
sys.argv = ['E:\\documents\\F盘\\testassert.py', '9555']
您输入的是: 9555
输入正确
# 输入负数,不用-O ,会执行 assert 语句
D:\python39>python E:\documents\F盘\testassert.py -9555
sys.argv = ['E:\\documents\\F盘\\testassert.py', '-9555']
您输入的是: -9555
Traceback (most recent call last):
File "E:\documents\F盘\testassert.py", line 9, in <module>
testassert(sys.argv[1])
File "E:\documents\F盘\testassert.py", line 4, in testassert
assert int(x) >= 0,'输入的数必须大于等于0'
AssertionError: 输入的数必须大于等于0
# -O 忽略 assert 语句的执行
D:\python39>python -O E:\documents\F盘\testassert.py -9555
sys.argv = ['E:\\documents\\F盘\\testassert.py', '-9555']
您输入的是: -9555
输入正确
复制
1.4 assert用于断言业务约束条件
描述
python的assert语句用于收集断言业务约束条件,而不是python语法相关的错误。
示例
比如,业务规则要求输入大于等于0的数字。
1 import traceback
2 def testassert(x):
3 assert int(x) >= 0,'输入的数必须大于等于0'
4 print('输入正确')
5
6 if __name__ == '__main__':
7 print('__debug__ =',__debug__)
8 while True:
9 print('-'*20)
10 try:
11 x=input("请输入大于等于0的数:")
12 print('您输入的是:',x)
13 testassert(x)
14 except ValueError as ve:
15 print('必须输入数字')
16 traceback.print_exc()
17 except Exception as e:
18 print(e)
19 traceback.print_exc()
20 else:
21 break
复制
cmd命令行执行
D:\python39>python E:\documents\F盘\testassert.py
--------------------
请输入大于等于0的数:梯阅线条
您输入的是: 梯阅线条
必须输入数字
Traceback (most recent call last):
File "E:\documents\F盘\testassert.py", line 12, in <module>
testassert(x)
File "E:\documents\F盘\testassert.py", line 3, in testassert
assert int(x) >= 0,'输入的数必须大于等于0'
ValueError: invalid literal for int() with base 10: '梯阅线条'
--------------------
请输入大于等于0的数:tyxt
您输入的是: tyxt
必须输入数字
Traceback (most recent call last):
File "E:\documents\F盘\testassert.py", line 12, in <module>
testassert(x)
File "E:\documents\F盘\testassert.py", line 3, in testassert
assert int(x) >= 0,'输入的数必须大于等于0'
ValueError: invalid literal for int() with base 10: 'tyxt'
--------------------
请输入大于等于0的数:-9
您输入的是: -9
输入的数必须大于等于0
Traceback (most recent call last):
File "E:\documents\F盘\testassert.py", line 12, in <module>
testassert(x)
File "E:\documents\F盘\testassert.py", line 3, in testassert
assert int(x) >= 0,'输入的数必须大于等于0'
AssertionError: 输入的数必须大于等于0
--------------------
请输入大于等于0的数:9555
您输入的是: 9555
输入正确
复制
1.5 assert用于抽象超类
描述
显式要求子类必须实现抽象超类的方法,可以在超类方法用assert False。
关于抽象超类的内容可以参考《python类接口和抽象超类》
示例
>>> class AbsSuper:
def delegate(self):
self.action()
def action(self):
assert False,'子类必须定义 action'
>>> class Provider(AbsSuper):pass
>>> Provider().delegate()
Traceback (most recent call last):
File "<pyshell#19>", line 1, in <module>
Provider().delegate()
File "<pyshell#16>", line 3, in delegate
self.action()
File "<pyshell#16>", line 5, in action
assert False,'子类必须定义 action'
AssertionError: 子类必须定义 action
复制
2 END
本文首发微信公众号:梯阅线条,
更多内容参考python知识分享或软件测试开发目录。
文章转载自梯阅线条,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。
文章被以下合辑收录
评论
相关阅读
[MYSQL] 服务器出现大量的TIME_WAIT, 每天凌晨就清零了
大大刺猬
157次阅读
2025-04-01 16:20:44
mysql提升10倍count(*)的神器
大大刺猬
139次阅读
2025-03-21 16:54:21
官宣,Milvus SDK v2发布!原生异步接口、支持MCP、性能提升
ZILLIZ
108次阅读
2025-04-02 09:34:13
[MYSQL] query_id和STATEMENT_ID在不同OS上的关系
大大刺猬
77次阅读
2025-03-26 19:08:13
DataWorks :Data+AI 一体化开发实战图谱
阿里云大数据AI技术
51次阅读
2025-03-19 11:00:55
国密算法介绍
漫步者
48次阅读
2025-03-21 09:20:39
WingPro for Mac 强大的Python开发工具 v10.0.9注册激活版
一梦江湖远
40次阅读
2025-03-29 10:33:27
python操作MySQL数据库
怀念和想念
34次阅读
2025-03-30 23:22:07
AI与我共创WEB界面
布衣
30次阅读
2025-04-14 22:13:51
Python使用MySQL数据库(新)
怀念和想念
30次阅读
2025-03-26 09:11:04