首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当__debug__ == False时断言断言

当__debug__ == False时断言断言
EN

Stack Overflow用户
提问于 2015-02-19 14:05:32
回答 1查看 1.3K关注 0票数 2

我制作了一个简单的测试程序来测试使用__debug__ (__debug__ = valueSyntaxError)分配给SyntaxError的功能。它基本上尝试引发一个AssertionError,并在错误被引发时打印出来,以及它是否是预期的。我是这样做的,因为我遇到了__debug__改变中间程序的问题。

代码语言:javascript
复制
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标志,它都会产生意想不到的结果。

代码语言:javascript
复制
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实际上并没有检查它是否改变了。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-02-19 14:05:32

您不应该更改__debug__的值

正如这里下的说明所述:

注意:名称NoneFalseTrue__debug__不能重新分配(分配给它们,即使作为属性名,也会引发SyntaxError),因此它们可以被视为“真”常量。

之所以会发生这种情况,是因为__debug__不是在运行时计算的,而是(在编译时) -O命令行标志。另见运行时与编译时间

虽然您可以通过hack __debug__更改globals()["__debug__"]的值,但是它什么也不做,因为assert expression1, expression2并不真正检查__debug__的值。提供-O标志将False分配给__debug__并删除所有assert语句。也就是说,assert语句是由-O标志而不是__debug__变量删除的。

您可以从dis()dis中看到这一点。使用以下代码:

代码语言:javascript
复制
import dis
dis.dis("assert False")

没有-O标志(path\to\file>python file.py):

代码语言:javascript
复制
  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):

代码语言:javascript
复制
  1           0 LOAD_CONST               0 (None)
              3 RETURN_VALUE

正如您所看到的,assert语句实际上是从代码中删除的。带有-O标志的第0至第3行与没有标记的第12至15行完全相同。它在哪里检查__debug__的值。

票数 13
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28608385

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档