条件调试语句未执行,尽管调试是Tru

2024-04-29 08:31:49 发布

您现在位置:Python中文网/ 问答频道 /正文

短版本

我正在调试的一段代码检查__debug__的值,如果是真的,则执行一些代码。

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__是否为“truthy”的所有方法,所有3个语句都表示__debug__为真。类似地,将__debug__强制转换为布尔值,然后对if(第88行)进行求值也可以按预期工作。90号线是一个愚蠢的检查。

__debug__的工作方式中,我是否遗漏了可能导致这种情况的任何东西?

注意:我在处理进入python-ldap模块中的_ldap_function_call函数的错误时发现了这个问题。我只在使用I I s时出现这个错误-Django的开发服务器一切正常。


Tags: 代码debugtrueifossyslinefunction
1条回答
网友
1楼 · 发布于 2024-04-29 08:31:49

如果重新绑定__debug__,它可能会导致与此完全相同的症状。

这是因为__debug__有点神奇。在模块编译期间,处理文本的同一代码还处理魔法常数...NoneTrueFalse__debug__。(例如,请参见^{}。)

如果对代码运行dis来转储字节码,您将看到if __debug__:语句被完全删除,或者使用LOAD_CONST来加载编译时debug常量,而if bool(__debug__):语句使用LOAD_GLOBAL来加载__debug__的值。

当然,除非重新绑定__debug__,否则这些都保证是相同的。在2.3左右的某个地方,仅仅写__debug__ = False是违法的。在2.7和3.0中,绑定名为__debug__的任何属性都是非法的,这意味着您不能再执行类似sys.modules[__name__].__debug__ = False的操作。但你仍然可以这样做,例如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的代码。

相关问题 更多 >