在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!')