我可以用初始化来定义全局变量吗?

2024-05-29 10:06:21 发布

您现在位置:Python中文网/ 问答频道 /正文

我想定义一个常量,它应该在包的所有子模块中都可用。我认为最好的位置应该在根包的__init__.py文件中。但我不知道怎么做。假设我有几个子包,每个子包都有几个模块。如何从这些模块访问该变量?

当然,如果这是完全错误的,还有更好的选择,我想知道。


Tags: 模块文件py定义init错误常量根包
3条回答

您可以从任何地方定义全局变量,但这是一个非常糟糕的主意。导入__builtin__模块并修改或添加此模块的属性,突然您就有了新的内置常量或函数。事实上,当我的应用程序安装gettext时,我在所有模块中都得到了u()函数,而没有导入任何内容。所以这是可能的,但当然只适用于应用程序类型的项目,而不适用于可重用的包或模块。

我想没人会推荐这种做法。命名空间有什么问题?所述应用程序具有版本模块,因此我有“全局”变量,如version.VERSIONversion.PACKAGE_NAME

你不能那样做。必须明确地将常量导入到每个模块的命名空间中。实现这一点的最佳方法是在“配置”模块中定义常量,并将其导入所需的任何位置:

# mypackage/config.py
MY_CONST = 17

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

你应该可以把它们放进__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导入常量。

相关问题 更多 >

    热门问题