我是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
谁能告诉我我做错了什么?
答案 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的答案提供了一个很好的解决方案。