我可以用__init__.py定义全局变量吗?

190 投票
4 回答
140721 浏览
提问于 2025-04-15 14:05

我想定义一个常量,这个常量应该在一个包的所有子模块中都能使用。我觉得最好的地方是在根包的 __init__.py 文件里。但是我不知道该怎么做。假设我有几个子包,每个子包里还有几个模块。我该如何在这些模块中访问这个变量呢?

当然,如果这样做完全不对,或者有更好的方法,我也想知道。

4 个回答

2

你可以在任何地方定义全局变量,但这其实是个很糟糕的主意。你可以导入一个叫做__builtin__的模块,然后修改或者添加这个模块的属性,这样你就能突然拥有新的内置常量或函数。实际上,当我的应用程序安装了gettext后,我在所有模块中都能使用_()这个函数,而不需要导入任何东西。所以这虽然可行,但当然只适用于应用程序类型的项目,不适合可重用的包或模块。

而且我想没有人会推荐这种做法。使用命名空间有什么不好呢?比如说这个应用程序有一个版本模块,这样我就可以像version.VERSIONversion.PACKAGE_NAME这样使用“全局”变量。

37

你不能这样做。你需要在每个模块中明确地导入你的常量。最好的方法是把常量放在一个“配置”模块里,然后在需要的地方导入它:

# mypackage/config.py
MY_CONST = 17

# mypackage/main.py
from mypackage.config import *
275

你可以把它们放在 __init__.py 文件里。这种做法是很常见的。

mypackage/__init__.py:

MY_CONSTANT = 42

mypackage/mymodule.py:

from mypackage import MY_CONSTANT
print "my constant is", MY_CONSTANT

然后,导入 mymodule:

>>> from mypackage import mymodule
my constant is 42

不过,如果你有常量的话,把它们放在一个单独的模块里(比如 constants.py 或 config.py)会更合理(这也是一种好的做法)。如果你想在包的命名空间里使用这些常量,可以把它们导入进来。

mypackage/__init__.py:

from mypackage.constants import *

不过,这样做并不会自动把常量包含在包模块的命名空间里。包里的每个模块仍然需要明确地从 mypackagemypackage.constants 导入常量。

撰写回答