Python 中的断言( assert )

Python 中的断言( assert )

我看到网上一些类似文章要么不准确,要么语焉不详,特此写本文,供新手参考。

由Python 文档https://docs.python.org/3/reference/simple_stmts.html#assert 可知,assert 语句的语法如下所示:

assert_stmt ::= "assert" expression1 ["," expression2]  

此乃编译原理的定义格式,通俗说法为:

assert expression1 [, expression2]

其中expression1是需要测试的条件, expression2为错误消息提示是可选的,测试的条件为假时显示之。在执行时,Python 解释器将之等价为以下这些语句:

    if __debug__:

       if not expression1:

           raise AssertionError(expression2)

需要说明两点:

    第一,代码在检查断言条件之前,还会检查__debug__全局变量。这是一个内置的布尔标记,,内置变量 __debug__ 在正常情况下为 True。

    第二,当expression1为真时,程序继续往下执行,只是判断,不做任何处理;

当expression1为假时,中断程序,抛出AssertionError错误,并将expression2消息输出。

 

例1、

def foo(s):
    n = int(s)
    assert n != 0, 'n is zero!'
    return 10 / n

print(foo('2')) #程序不报错,将该句改为print(foo('0')) # 代码执行结果, AssertionError: n is zero!

 

例2本例演示了用try语句捕获assert抛出异常,代码如下:

def testAssert():
    for i in range(4):
        try:
            assert i<2
        except AssertionError:
            print('捕获assert抛出的异常!')
        print(i)
    print('......end......')

testAssert()

本例中定义了testAssert函数,当for循环变量i为2时,assert后的条件i<2为假,因此抛出AssertionError,因为这个异常被捕获处理,程序不会中断,直至for循环正常结束。

运行效果如下:

0
1
捕获assert抛出的异常!
2
捕获assert抛出的异常!
3
......end......

 

如何禁用Python中的断言?怎么做?

断言语句是可以被禁用的——需要满足__debug__ == flase,可以这样做:

若在命令行中使用-O 和-OO 标识,或修改Python 中的PYTHONOPTIMIZE环境变量,都会全局禁用断言。

如,,在命令行中使用-O标志(大写字母O)调用Python运行scriptName.py :

python -O scriptName.py

 

关于__debug__可参见https://docs.python.org/zh-cn/3/library/constants.html?highlight=__debug__#__debug__

 

 

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

学习&实践爱好者

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值