tur*_*nvh 9 python debugging iis-7 python-ldap
精简版
我有一段代码我正在调试它检查值__debug__并执行一些代码,如果它是True.
if __debug__:
<stuff happens>
Run Code Online (Sandbox Code Playgroud)
问题是"东西"永远不会发生,即使__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)
Run Code Online (Sandbox Code Playgroud)
我最困惑的代码片段如下所示:
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__))
Run Code Online (Sandbox Code Playgroud)
输出文件如下所示:
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
Run Code Online (Sandbox Code Playgroud)
前三个陈述(第82-84行)是我能想到的每一种方式,检查是否__debug__"真实",而所有3个暗示__debug__都是真的.类似地,__debug__作为布尔值进行转换然后评估if(第88行)也按预期工作.90号线是一个愚蠢的健全检查.
是否有任何我__debug__可能造成这种情况的工作方式中缺少的东西?
注意:我在我正在处理模块中的_ldap_function_call函数时遇到错误时发现了这一点python-ldap.我在使用IIS时只会遇到这个错误 - 一切都可以正常使用Django的开发服务器.
如果重新绑定__debug__,可能会导致完全像这样的症状。
这是因为__debug__有些神奇。在模块编译,相同的代码来处理文字也处理的魔术常量...,None,True,False,和__debug__。(例如,请参阅expr_constant。)
如果您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"
Run Code Online (Sandbox Code Playgroud)
打印输出:
debug
bool
debug2
Run Code Online (Sandbox Code Playgroud)
同样,对于使用时将其设置为True的代码python -O。