python异常之assert语句

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 "", line 1, in <module>
    testassert(-9)
  File "", 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 "", line 1, in <module>
    testassert(-9)
  File "", 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 "", line 1, in <module>
    Provider().delegate()
  File "", line 3, in delegate
    self.action()
  File "", line 5, in action
    assert False,'子类必须定义 action'
AssertionError: 子类必须定义 action

你可能感兴趣的:(python,python)