在 Python 中禁用断言

2025-03-11 08:54:00
admin
原创
72
摘要:问题描述:如何在 Python 中禁用断言?也就是说,如果断言失败,我不希望它抛出AssertionError,而是继续前进。我该如何做?解决方案 1:如何在 Python 中禁用断言?有多种方法可以影响单个进程、环境或单行代码。我会逐一进行演示。整个过程使用-O标志(大写 O)可禁用进程中的所有断言语句。例...

问题描述:

如何在 Python 中禁用断言?

也就是说,如果断言失败,我不希望它抛出AssertionError,而是继续前进。

我该如何做?


解决方案 1:

如何在 Python 中禁用断言?

有多种方法可以影响单个进程、环境或单行代码。

我会逐一进行演示。

整个过程

使用-O标志(大写 O)可禁用进程中的所有断言语句。

例如:

$ python -Oc "assert False"

$ python -c "assert False"
Traceback (most recent call last):
  File "<string>", line 1, in <module>
AssertionError

请注意,我所说的禁用是指它也不会执行其后面的表达式:

$ python -Oc "assert 1/0"

$ python -c "assert 1/0"
Traceback (most recent call last):
  File "<string>", line 1, in <module>
ZeroDivisionError: integer division or modulo by zero

对于环境

您也可以使用环境变量来设置此标志。

这将影响使用或继承该环境的每个进程。

例如,在 Windows 中,设置然后清除环境变量:

C:>python -c "assert False"
Traceback (most recent call last):
  File "<string>", line 1, in <module>
AssertionError
C:>SET PYTHONOPTIMIZE=TRUE

C:>python -c "assert False"

C:>SET PYTHONOPTIMIZE=

C:>python -c "assert False"
Traceback (most recent call last):
  File "<string>", line 1, in <module>
AssertionError

与 Unix 相同(使用 set 和unset实现相应的功能)

代码中的单点

你继续你的问题:

如果断言失败,我不希望它抛出 AssertionError,而是继续运行。

您可以确保控制流不会到达断言,例如:

if False:
    assert False, "we know this fails, but we don't get here"

或者如果您希望断言表达式被执行,那么您可以捕获断言错误:

try:
    assert False, "this code runs, fails, and the exception is caught"
except AssertionError as e:
    print(repr(e))

打印结果为:

AssertionError('this code runs, fails, and the exception is caught')

你 会 从 你 处理 的 那个 点 继续 前进AssertionError.

参考

来自文档assert:​

像这样的断言语句:

assert expression #, optional_message

相当于

if __debug__:
    if not expression: raise AssertionError #(optional_message)

和,

内置变量__debug__True正常情况下,False当请求优化时(命令行选项-O)。

以及进一步

赋值__debug__是非法的。内置变量的值是在解释器启动时确定的。

来自使用文档:

-O

启用基本优化。这会将已编译(字节码)文件的文件扩展名从 .pyc 更改为 .pyo。另请参阅 PYTHONOPTIMIZE。

优化

如果设置为非空字符串,则相当于指定选项-O。如果设置为整数,则相当于指定-O多次。

解决方案 2:

使用 -O 标志调用 Python:

测试.py:

assert False
print('Done')

输出:

C:    emppy>C:Python26python.exe test.py
Traceback (most recent call last):
  File "test.py", line 1, in <module>
    assert(False)
AssertionError

C:    emppy>C:Python26python.exe -O test.py
Done

解决方案 3:

已经给出的两个答案都是有效的(在命令行上使用-O或调用 Python)。-OO

根据Python 文档,它们之间的区别如下:

  • -O启用基本优化。这会将已编译(字节码)文件的文件扩展名从 .pyc 更改为 .pyo。

  • -OO除了优化之外,还丢弃文档字符串-O

要检查断言是否启用或禁用,请查看的值__debug__

解决方案 4:

使用python -O

$ python -O
>>> assert False
>>> 

解决方案 5:

应该禁用断言。当注意力在其他地方时,它们会捕获意外错误。请参阅“十的力量”中的规则 5 (DOI,维基百科)。

raise语句,而不是assert语句:

if x_is_broken():
    raise RuntimeError('`x` is broken.')

raise无论使用哪种优化选项运行 Python,语句始终存在。此外,使用语句raise可以指定不同于的异常类型AssertionError。这对用户非常有用。此外,只需编写一个raise语句,就会促使人们问自己AssertionError这是否是正确的选择。

此外,在编写raise语句时,我们通常会写一条信息性消息,例如raise AssertionError('An error occurred with x.')。在语句中可以assert一条错误消息(例如,assert x, 'An error occurred with x.'和 括号可用于表示多行消息),但是,可能会忘记。相反,raise AssertionError(....)要求....填写 (并且这种形式raise AssertionError不常见,不推荐)。

当编写错误消息时,会发现有多少进一步的编码错误会引人注目。

旁注:计算量大的断言检查只能在需要时运行。一种方法是:

import logging


log = logging.getLogger(__name__)


if log.getEffectiveLevel() < logging.DEBUG:
    if not check_expensive_property(x):
        raise RuntimeError('`x` is broken.')

解决方案 6:

在优化模式下运行应该可以做到:

python -OO module.py
相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   2787  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1710  
  产品配置管理在企业产品研发与生产过程中扮演着至关重要的角色,它能够确保产品在不同阶段的一致性、可追溯性以及高效的变更管理。PLM(产品生命周期管理)系统作为整合产品全生命周期信息的平台,为产品配置管理提供了强大的支持。随着技术的不断发展,到2025年,PLM系统在支持产品配置管理方面将有一系列值得关注的技术实践。基于人...
plm系统主要干什么的   11  
  敏捷迭代周期与 PLM 流程的适配是现代企业在产品开发过程中面临的重要课题。随着市场竞争的加剧和技术的快速发展,企业需要更加高效、灵活的产品开发模式,以满足客户不断变化的需求。敏捷迭代周期强调快速响应变化、持续交付价值,而 PLM 流程则侧重于产品全生命周期的管理和控制。如何将两者有机结合,优化交付节奏,成为提升企业竞...
plm是什么意思   10  
  在企业的数字化转型进程中,PLM(产品生命周期管理)与ERP(企业资源计划)作为两款重要的企业级系统,发挥着关键作用。然而,很多企业人员对它们之间的区别以及协同逻辑并不十分清晰。深入了解这两者的差异与协同方式,有助于企业更好地规划信息化建设,提升整体运营效率。PLM系统概述PLM系统聚焦于产品从概念设计到退役的全生命周...
国产plm软件   12  
热门文章
项目管理软件有哪些?
曾咪二维码

扫码咨询,免费领取项目管理大礼包!

云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用