暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

python异常之assert语句

原创 梯阅线条 2024-01-04
109

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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

文章被以下合辑收录

评论