在Python中禁用断言

Cla*_*diu 75 python debugging assert exception-handling environment-variables

如何在Python中禁用断言?

也就是说,如果一个断言失败了,我不希望它抛出AssertionError,但继续前进.

我怎么做?

Mar*_*off 57

使用-O标志调用Python:

test.py:

assert(False)
print 'Done'
Run Code Online (Sandbox Code Playgroud)

输出:

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
Run Code Online (Sandbox Code Playgroud)

  • 断言不是一个函数,因此parens是多余的. (3认同)

Aar*_*all 55

如何在Python中禁用断言?

有多种方法会影响单个进程,环境或单行代码.

我演示每一个.

对于整个过程

使用-O标志(大写O)禁用进程中的所有断言语句.

例如:

$ python -Oc "assert False"

$ python -c "assert False"
Traceback (most recent call last):
  File "<string>", line 1, in <module>
AssertionError
Run Code Online (Sandbox Code Playgroud)

请注意,通过禁用我的意思是它也不执行它后面的表达式:

$ 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
Run Code Online (Sandbox Code Playgroud)

对于环境

您也可以使用环境变量来设置此标志.

这将影响使用或继承环境的每个进程.

例如,在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
Run Code Online (Sandbox Code Playgroud)

在Unix中相同(使用set和unset为各自的功能)

单点代码

你继续提问:

如果断言失败,我不希望它抛出AssertionError,而是继续.

如果您希望代码无法执行,则可以捕获断言错误:

if False:
    assert False, "we know this fails, but we don't get here"
Run Code Online (Sandbox Code Playgroud)

打印:

try:
    assert False, "this code runs, fails, and the exception is caught"
except AssertionError as e:
    print(repr(e))
Run Code Online (Sandbox Code Playgroud)

你将继续从你处理的那一点开始AssertionError.

参考

assert文档:

像这样的断言语句:

AssertionError('this code runs, fails, and the exception is caught')
Run Code Online (Sandbox Code Playgroud)

相当于

assert expression #, optional_message
Run Code Online (Sandbox Code Playgroud)

和,

内置变量__debug__True在正常情况下,False当优化要求(命令行选项-O).

从使用文档:

-O

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

PYTHONOPTIMIZE

如果将其设置为非空字符串,则等同于指定__debug__选项.如果设置为整数,则相当于-O多次指定.

  • @Matthijs,您可以确保控制流不会到达它(例如“if False:assert False”),或者您可以捕获断言错误。这些是你的选择。更新了答案以解决您的问题。 (2认同)
  • 您可以重写函数的字节码、重写 AST 或重写函数本身。(手动或编程,两者均可)。重写 AST 可能是最可靠的方法(“简单地”用“Pass”对象替换“Assert”对象)。上下文管理器不能直接用于此目的,但您可以拥有某种以这种方式使用装饰函数的机制。无论如何,我不推荐它。我怀疑您想要这样做的原因是您正在调用您无法控制的代码并收到断言错误。如果是这样,您可能需要找到不同的修复方法。 (2认同)

Mic*_*rie 14

已经给出的两个答案都是有效的(使用-O-OO在命令行上调用Python ).

这是他们之间的区别:

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

  • -OO除了-O优化之外,还要放弃文档字符串.

(来自Python文档)


Joh*_*kin 7

用途python -O:

$ python -O
>>> assert False
>>> 
Run Code Online (Sandbox Code Playgroud)