当__DEBUG__==FALSE时断言 [英] assert asserting when __debug__ == False

查看:0
本文介绍了当__DEBUG__==FALSE时断言的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我做了一个简单的测试程序来测试使用globals()["__debug__"] = value(__debug__ = valueSyntaxError)赋值给__debug__的功能。它主要尝试引发一个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实际上并未检查是否已更改。

调试

您不应更改__推荐答案__的值
正如here下面的注释所述:

注意:NoneFalseTrue__debug__不能重新赋值(为它们赋值,即使作为属性名称,也要提高SyntaxError),因此可以将它们视为"真"常量

发生这种情况的原因是__debug__不是在运行时计算,而是-O命令行标志是(在编译时)计算的。另请参阅Runtime vs Compile time

虽然您可以通过hackglobals()["__debug__"]更改__debug__的值,但它不执行任何操作,因为assert expression1, expression2不会真正检查__debug__的值。提供-O标志会将False赋给__debug__,并删除所有Assert语句。也就是说,assert语句由-O标志删除,而不是__debug__变量删除。

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

import dis
dis.dis("assert False")

不带-O标志(path ofile>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 ofile>python -O file.py):

  1           0 LOAD_CONST               0 (None)
              3 RETURN_VALUE

如您所见,assert语句基本上从代码中删除了。带有-O标志的第0至3行与未带有标志的第12至15行相同。否它在哪里检查__debug__的值。

这篇关于当__DEBUG__==FALSE时断言的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆