2009-01-30 102 views
11

我是python的新手,所以请原谅可能是一个非常愚蠢的问题。python中的全局变量混淆

基本上,我有一个名为_debug的全局变量,它用于确定脚本是否应该输出调试信息。我的问题是,我不能将它设置为与使用它不同的python脚本。

我有两个脚本:

one.py: 
------- 

def my_function(): 
    if _debug: 
    print "debugging!" 


two.py: 
------- 

from one import * 
_debug = False 

my_function() 

运行two.py产生一个错误:

NameError: global name '_debug' is not defined 

谁能告诉我什么,我做错了什么?以下划线开始

回答

16

还有更多的问题,恐怕不仅仅是领先的下划线。

当您拨打my_function()时,它的名称空间中仍然不会有debug变量,除非您从two.py导入它。

当然,这样做意味着您最终会得到循环依赖关系(one.py -> two.py -> one.py),您将得到NameError s,除非您重构导入和声明各种东西的地方。

一个解决方案是创建一个简单的第三个模块,它定义这样的“常量”,这可以从任何地方安全地进口,如:

constants.py 
------------ 
debug = True 

one.py 
------ 
from constants import debug 
#... 

two.py 
------ 
from constants import debug 
#... 

不过,我只想使用内置的logging推荐这个模块 - 为什么不呢?它配置简单,使用更简单,可靠,灵活且可扩展。

5

名称可能与

from one import * 
+1

这是因为他们的意思是“这是内部的东西,不要触摸它,或者这样做是在你自己的风险”。 – 2009-01-30 14:00:09

+0

我真的感到震惊的是,一个完全不正确的答案已被接受并投票赞成如此之高。 – 2009-01-30 14:02:09

4

进口也可以使用__debug__变量进行调试。如果解释器没有用-O选项启动,这是事实。 assert语句也可能有帮助。

1

更多解释:功能my_function的名称空间始终位于模块one中。这意味着当在my_function中找不到名称_debug时,它在one中查找,而不是调用该函数的命名空间。雪花石膏的答案提供了一个很好的解决方案。