我是新来的蟒蛇,所以请原谅什么可能是一个非常愚蠢的问题。

基本上,我有一个单一的全局变量,称为_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)结束,除非你重构将各种东西都是进口的,并宣布你会得到NameErrors。

一个解决方案是创建一个简单的第三模块,其限定这样“常量”,它可以从任何地方安全地导入,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,而不是命名空间。阿拉巴斯特的回答提供了一个很好的解决方案。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top