Python 中的断言( assert )

本文深入讲解Python中的断言(assert)语句,包括其语法、工作原理及如何禁用断言。通过实例演示了断言在代码中的应用及如何捕获断言异常。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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__

 

 

### Python `assert` 断言的使用方法、示例及其作用 #### 使用方法 在 Python 中,`assert` 是一种调试工具,用于声明某个条件必须为真。它的基本语法如下: ```python assert expression [, arguments] ``` 其中,`expression` 是一个布尔表达式,如果该表达式的值为假,则会抛出 `AssertionError` 异常[^3]。 可以通过可选的 `arguments` 来提供额外的信息,帮助开发者快速定位问题所在。这种附加信息通常是一个字符串或其他对象,在断言失败时会被打印出来作为错误提示[^2]。 #### 示例代码 下面是一些具体的例子来展示如何使用 `assert`: ##### 基本用法 当仅需验证简单条件时: ```python def divide(a, b): assert b != 0, "除数不能为零" return a / b print(divide(10, 2)) # 正确执行 print(divide(10, 0)) # 抛出 AssertionError 并附带自定义消息 ``` ##### 验证数据结构长度 对于集合或者序列类型的输入参数,可以确保它们满足特定的要求: ```python lists = [1, 2, 3] assert len(lists) >= 5, '列表元素个数小于5' # 如果 lists 的长度不足 5 则触发异常 ``` ##### 数学运算中的校验 在涉及数值计算的地方加入断言可以帮助捕捉潜在逻辑缺陷: ```python result = 2 * (3 + 4) assert result == 14, f'预期结果应为 {2*(3+4)} 而实际得到的是 {result}' ``` #### 主要作用 - **早期发现问题**:通过尽早检测到不符合预期的情况,能够减少后期难以追踪复杂错误的可能性[^1]。 - **提高代码质量**:强制程序员思考函数内部假设以及边界情况处理方式,从而编写更加健壮可靠的软件[^2]。 - **简化测试过程**:虽然它不应该替代正式单元测试框架,但在开发阶段利用好它可以加快找到 bug 的速度[^4]。 需要注意的一点是,在生产环境中运行经过 `-O` 或者 `-OO` 编译标志优化后的脚本时,所有的 `assert` 语句都会被忽略掉,因此不应依赖于他们来进行关键业务逻辑控制[^4]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

学习&实践爱好者

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

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

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

打赏作者

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

抵扣说明:

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

余额充值