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

And*_* II 116 python module packages global-variables init

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

当然,如果这是完全错误的,并且有更好的选择,我想知道它.

Jas*_*mbs 178

你应该能够把它们放进去__init__.py.这是一直这样做的.

mypackage/__init__.py:

MY_CONSTANT = 42
Run Code Online (Sandbox Code Playgroud)

mypackage/mymodule.py:

from mypackage import MY_CONSTANT
print "my constant is", MY_CONSTANT
Run Code Online (Sandbox Code Playgroud)

然后,导入mymodule:

>>> from mypackage import mymodule
my constant is 42
Run Code Online (Sandbox Code Playgroud)

尽管如此,如果你确实有常量,那么将它们放在一个单独的模块(constants.py,config.py,...)中是合理的(可能是最佳实践)然后如果你想在它们的包名称空间中输入它们,那么他们.

mypackage/__init__.py:

from mypackage.constants import *
Run Code Online (Sandbox Code Playgroud)

但是,这并不会自动包含程序包模块名称空间中的常量.程序包中的每个模块仍然必须显式地从mypackage或从中导入常量mypackage.constants.

  • 这应该是公认的答案.如果您使用的是Python 2.5或更高版本,您还可以使用显式相对导入以及[here](http://docs.python.org/2/tutorial/modules.html#intra-package-references): `来自.导入MY_CONSTANT` (17认同)
  • 这个示例的一个问题是如果你在`__ init __.py`之前在`__init __.py`中导入`mymodule.py`将失败,因为导入`mymodule.py`时尚未定义MY_CONSTANT`.所以需要在`import mymodule`上面移动`MY_CONSTANT = 42` (5认同)

Fer*_*yer 30

你不能这样做.您必须明确地将常量导入每个单独模块的命名空间.实现此目的的最佳方法是在"config"模块中定义常量并将其导入到您需要的任何位置:

# mypackage/config.py
MY_CONST = 17

# mypackage/main.py
from mypackage.config import *
Run Code Online (Sandbox Code Playgroud)

  • 好点子。我没有意识到问题是将常量_自动_放置在所有包模块的命名空间中。 (2认同)