gpt4 book ai didi

python - 尽管 __debug__ 为真,但条件 __debug__ 语句未执行

转载 作者:太空狗 更新时间:2023-10-29 21:07:33 25 4
gpt4 key购买 nike

精简版

我有一段正在调试的代码会检查 __debug__ 的值并在它为 True 时执行一些代码。

if __debug__:
<stuff happens>

问题是“事情”永远不会发生,即使 __debug__ 看起来是真的。

长版/详细信息

为了检查这一点,我使用以下模式在函数执行时将几个变量(最显着的 __debug__)的值打印到一个文件中。 (我正在使用 os.open 因为 open 已经在这个模块中定义了。)

try:
myfile = os.open("test.txt", os.O_RDWR|os.O_CREAT|os.O_APPEND)
# work + some print statements to check the value of __DEBUG__
finally:
os.close(myfile)

我最困惑的一段代码是这样的:

os.write(myfile, "LINE %s | LDAP FUNCTION __DEBUG__: %s \n" %(sys._getframe(0).f_lineno, __debug__))
os.write(myfile, "LINE %s | LDAP FUNCTION __DEBUG__: %s \n" %(sys._getframe(0).f_lineno, type(__debug__)))
os.write(myfile, "LINE %s | LDAP FUNCTION __DEBUG__: %s \n" %(sys._getframe(0).f_lineno, bool(__debug__)))
if __debug__:
os.write(myfile, "LINE %s | LDAP FUNCTION __DEBUG__: %s \n" %(sys._getframe(0).f_lineno, __debug__))
if bool(__debug__):
os.write(myfile, "LINE %s | LDAP FUNCTION __DEBUG__: %s \n" %(sys._getframe(0).f_lineno, __debug__))
if True:
os.write(myfile, "LINE %s | LDAP FUNCTION __DEBUG__: %s \n" %(sys._getframe(0).f_lineno, __debug__))
if __debug__:
os.write(myfile, "LINE %s | LDAP FUNCTION __DEBUG__: %s \n" %(sys._getframe(0).f_lineno, __debug__))

输出文件如下所示:

LINE 82 | LDAP FUNCTION __DEBUG__: True 
LINE 83 | LDAP FUNCTION __DEBUG__: <type 'bool'>
LINE 84 | LDAP FUNCTION __DEBUG__: True
LINE 88 | LDAP FUNCTION __DEBUG__: True
LINE 90 | LDAP FUNCTION __DEBUG__: True

前 3 个语句(第 82-84 行)是我能想到的检查 __debug__ 是否“真实”的所有方式,所有 3 个语句都暗示 __debug__ 为真.同样,将 __debug__ 转换为 bool 值然后计算 if(第 88 行)也按预期工作。第 90 行是一个愚蠢的完整性检查。

我在 __debug__ 的工作方式中是否遗漏了什么可能导致此问题的原因?

注意:我在处理 python-ldap 模块中的 _ldap_function_call 函数时遇到的错误时发现了这一点。我只在使用 IIS 时遇到此错误 - 在 Django 的开发服务器上一切正常。

最佳答案

如果您重新绑定(bind) __debug__,它可能会导致完全像这样的症状。

这是因为 __debug__ 有点神奇。在模块编译期间,处理文字的相同代码还处理魔法常量 ...NoneTrueFalse__debug__。 (例如,参见 expr_constant。)

如果您在代码上运行 dis 以转储字节码,您会看到 if __debug__: 语句要么被完全删除,要么使用 LOAD_CONST 加载编译时 debug 常量,而 if bool(__debug__): 语句使用 LOAD_GLOBAL 加载 __调试__

当然这些保证是相同的......除非你重新绑定(bind)__debug__。在 2.3 左右的某个地方,只写 __debug__ = False 就变得非法了。在 2.7 和 3.0 中,绑定(bind) 任何 名为 __debug__ 的属性都是非法的,这意味着你不能再做类似 sys.modules[__name__].__debug__ =错误。但是您仍然可以这样做,例如 globals()['__debug__'] = False

无论哪种方式,你都会得到相同的效果:

if __debug__:
print "debug"
if bool(__debug__):
print "bool"

import sys
sys.modules[__name__].__debug__ = False

if __debug__:
print "debug2"
if bool(__debug__):
print "bool2"

打印出来:

debug
bool
debug2

对于使用 python -O 运行时将其设置为 True 的代码也是如此。

关于python - 尽管 __debug__ 为真,但条件 __debug__ 语句未执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15305688/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com