关于python中全局变量的困惑

时间:2009-01-30 12:56:58

标签: python global-variables python-import

我是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

谁能告诉我我做错了什么?

4 个答案:

答案 0 :(得分:16)

我担心的问题不仅仅是领先的下划线。

当您致电my_function()时,除非您从debug导入two.py,否则它的名称空间中仍然没有one.py -> two.py -> one.py变量。

当然,这样做意味着你最终会得到循环依赖(NameError),除非你重构导入和声明各种东西的地方,否则你将获得constants.py ------------ debug = True one.py ------ from constants import debug #... two.py ------ from constants import debug #...

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

{{1}}

但是,我建议只使用内置的logging模块 - 为什么不呢?它易于配置,易于使用,可靠,灵活且可扩展。

答案 1 :(得分:5)

以下划线开头的名称不会随

导入
from one import *

答案 2 :(得分:4)

您还可以使用__debug__变量进行调试。如果解释器没有使用-O选项启动,则确实如此。断言声明也可能有用。

答案 3 :(得分:1)

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