小编典典

在Python中禁用断言

python

如何在Python中禁用断言?

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

我怎么做?


阅读 221

收藏
2021-01-20

共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__通常TrueFalse要求优化的情况下使用(命令行选项-O)。

并进一步

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

从用法文档中:

-O

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

PYTHONOPTIMIZE

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

2021-01-20