如何在Python中禁用断言?
也就是说,如果断言失败,我不希望它抛出AssertionError,而是继续前进。
AssertionError
我怎么做?
有多种方法会影响单个流程,环境或一行代码。
我演示每个。
使用-O标志(大写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
如下的断言语句:
assert expression #, optional_message
相当于
if __debug__: if not expression: raise AssertionError #(optional_message)
和,
内置变量__debug__通常True在False要求优化的情况下使用(命令行选项-O)。
__debug__
True
False
并进一步
转让给__debug__是非法的。内置变量的值在解释器启动时确定。
从用法文档中:
-O 打开基本优化。这会将已编译(字节码)文件的文件扩展名从.pyc更改为.pyo。另请参阅PYTHONOPTIMIZE。
打开基本优化。这会将已编译(字节码)文件的文件扩展名从.pyc更改为.pyo。另请参阅PYTHONOPTIMIZE。
和
PYTHONOPTIMIZE 如果将其设置为非空字符串,则等效于指定-O选项。如果设置为整数,则等效于-O多次指定。
PYTHONOPTIMIZE
如果将其设置为非空字符串,则等效于指定-O选项。如果设置为整数,则等效于-O多次指定。