在Python中禁用断言

如何禁用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 

为了环境

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

这将影响使用或inheritance环境的每个进程。

例如,在Windows中,设置并清除环境variables:

 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来实现各自的function)

单点代码

你继续你的问题:

如果一个断言失败了,我不希望它抛出一个AssertionError,而是继续前进。

如果你想要执行失败的代码,你可以捕获一个断言错误:

 >>> try: ... assert False, "we know this fails" ... except AssertionError as e: ... print(repr(e)) ... AssertionError('we know this fails',) 

你将继续从你处理AssertionError的angular度去做。

参考

assert文档 :

像这样的断言:

 assert expression #, optional_message 

相当于

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

和,

内置variables__debug__在正常情况下为True ,请求优化时为False (命令行选项-O )。

从使用文档:

-O

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

PYTHONOPTIMIZE

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

用-O标志调用Python:

test.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-OO )。

这是他们之间的区别:

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

  • -OO -O优化外还舍弃文档。

(来自Python文档 )

使用python -O

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

在优化模式下运行应该这样做:

 python -OO module.py 

你不应该禁用(大多数)断言。 当别人注意到他们时,他们会发现不可预料的错误。 见“十的力量”中的规则5。

相反,通过如下方式来防范一些昂贵的断言检查:

 import logging logger = logging.getLogger(__name__) if logger.getEffectiveLevel() < logging.DEBUG: ok = check_expensive_property() assert ok, 'Run !' 

保持重要断言的一种方式,并允许assert陈述被优化掉的方法是在select声明中提出它们:

 if foo_is_broken(): raise AssertionError('Foo is broken!')