python的assert语句,是一个断言语句。
用于断言某个表达式的值是否符合预期,不符合则停止运行,并且触发AssertionError异常。
用法
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
用法
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
用法
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
输入正确
描述
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
输入正确
描述
显式要求子类必须实现抽象超类的方法,可以在超类方法用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