如何在 Python 中禁用断言?
也就是说,如果一个断言失败,我不希望它抛出一个AssertionError
,而是继续。
我怎么做?
如何在 Python 中禁用断言?
也就是说,如果一个断言失败,我不希望它抛出一个AssertionError
,而是继续。
我怎么做?
如何在 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 expression #, optional_message
相当于
if __debug__: if not expression: raise AssertionError #(optional_message)
和,
内置变量
__debug__
是True
在正常情况下,False
请求优化时(命令行选项-O
)。
并进一步
分配给
__debug__
是非法的。内置变量的值在解释器启动时确定。
从使用文档:
打开基本优化。这会将已编译(字节码)文件的文件扩展名从 .pyc 更改为 .pyo。另请参阅 PYTHONOPTIMIZE。
和
如果将其设置为非空字符串,则等效于指定
-O
选项。如果设置为整数,则相当于指定-O
多次。
使用 -O 标志调用 Python:
测试.py:
assert False
print('Done')
输出:
C:\temp\py>C:\Python26\python.exe test.py
Traceback (most recent call last):
File "test.py", line 1, in <module>
assert(False)
AssertionError
C:\temp\py>C:\Python26\python.exe -O test.py
Done
使用python -O
:
$ python -O
>>> assert False
>>>
在优化模式下运行应该这样做:
python -OO module.py
你不应该禁用断言。当注意力转移到别处时,他们会发现意料之外的错误。请参阅“十的幂”(DOI,维基百科)中的规则 5 。
写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.')