混淆Python中的全局变量
-
20-08-2019 - |
题
我是新来的蟒蛇,所以请原谅什么可能是一个非常愚蠢的问题。
基本上,我有一个单一的全局变量,称为_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
谁能告诉我什么,我做错了吗?
解决方案
有不仅仅是前导下划线恐怕更多的问题。
当你调用my_function()
,它仍然不会在其命名空间中的debug
变量,除非你从two.py
导入。
当然,这样做意味着你将与循环依赖(one.py -> two.py -> one.py
)结束,除非你重构将各种东西都是进口的,并宣布你会得到NameError
s。
一个解决方案是创建一个简单的第三模块,其限定这样“常量”,它可以从任何地方安全地导入,e.g:
constants.py
------------
debug = True
one.py
------
from constants import debug
#...
two.py
------
from constants import debug
#...
不过,我只想使用内置的记录模块推荐这 - 为什么不呢?这很容易配置,易于使用,可靠,灵活和可扩展的。
其他提示
以下划线开头的名称不与进口
from one import *
您也可以使用可变__debug__
进行调试。如果解释不与-O选项启动它是真实的。 assert语句可能会有所帮助了。
更多的位说明:本函数my_function
的名字空间总是在模块one
。这意味着,当_debug
没有找到该名my_function
,它看起来从该函数被调用one
,而不是命名空间。阿拉巴斯特的回答提供了一个很好的解决方案。
不隶属于 StackOverflow