短版本
我正在调试的一段代码检查__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的开发服务器一切正常。
如果重新绑定
__debug__
,它可能会导致与此完全相同的症状。这是因为} 。)
__debug__
有点神奇。在模块编译期间,处理文本的同一代码还处理魔法常数...
、None
、True
、False
和__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
。不管怎样,你都会得到同样的效果:
打印出来:
同样,对于使用
python -O
运行时将其设置为True的代码。相关问题 更多 >
编程相关推荐