我制作了一个简单的测试程序来测试使用__debug__ (__debug__ = value是SyntaxError)分配给SyntaxError的功能。它基本上尝试引发一个AssertionError,并在错误被引发时打印出来,以及它是否是预期的。我是这样做的,因为我遇到了__debug__改变中间程序的问题。
print("__debug__ is", __debug__)
exp = ["(expected)", "(not expected)"]
if __debug__:
exp = exp[::-1]
try:
assert False
print("No AssertionError", exp[0])
except AssertionError:
print("AssertionError", exp[1])
exp = exp[::-1]
globals()["__debug__"] = not __debug__
print("__debug__ is", __debug__)
try:
assert False
print("No AssertionError", exp[0])
except AssertionError:
print("AssertionError", exp[1])当从命令提示符运行时,无论是否使用-O标志,它都会产生意想不到的结果。
C:\Test>python assert.py
__debug__ is True
AssertionError (expected)
__debug__ is False
AssertionError (not expected)
C:\Test>python -O assert.py
__debug__ is False
No AssertionError (expected)
__debug__ is True
No AssertionError (not expected)__debug__似乎在改变,但assert实际上并没有检查它是否改变了。
发布于 2015-02-19 14:05:32
您不应该更改__debug__的值
正如这里下的说明所述:
注意:名称
None、False、True和__debug__不能重新分配(分配给它们,即使作为属性名,也会引发SyntaxError),因此它们可以被视为“真”常量。
之所以会发生这种情况,是因为__debug__不是在运行时计算的,而是(在编译时) -O命令行标志。另见运行时与编译时间。
虽然您可以通过hack __debug__更改globals()["__debug__"]的值,但是它什么也不做,因为assert expression1, expression2并不真正检查__debug__的值。提供-O标志将False分配给__debug__并删除所有assert语句。也就是说,assert语句是由-O标志而不是__debug__变量删除的。
您可以从dis()从dis中看到这一点。使用以下代码:
import dis
dis.dis("assert False")没有-O标志(path\to\file>python file.py):
1 0 LOAD_CONST 0 (False)
3 POP_JUMP_IF_TRUE 12
6 LOAD_GLOBAL 0 (AssertionError)
9 RAISE_VARARGS 1
>> 12 LOAD_CONST 1 (None)
15 RETURN_VALUE使用-O标志(path\to\file>python -O file.py):
1 0 LOAD_CONST 0 (None)
3 RETURN_VALUE正如您所看到的,assert语句实际上是从代码中删除的。带有-O标志的第0至第3行与没有标记的第12至15行完全相同。它在哪里检查__debug__的值。
https://stackoverflow.com/questions/28608385
复制相似问题