2024-05-29 10:06:21 发布
网友
我想定义一个常量,它应该在包的所有子模块中都可用。我认为最好的位置应该在根包的__init__.py文件中。但我不知道怎么做。假设我有几个子包,每个子包都有几个模块。如何从这些模块访问该变量?
__init__.py
当然,如果这是完全错误的,还有更好的选择,我想知道。
您可以从任何地方定义全局变量,但这是一个非常糟糕的主意。导入__builtin__模块并修改或添加此模块的属性,突然您就有了新的内置常量或函数。事实上,当我的应用程序安装gettext时,我在所有模块中都得到了u()函数,而没有导入任何内容。所以这是可能的,但当然只适用于应用程序类型的项目,而不适用于可重用的包或模块。
__builtin__
我想没人会推荐这种做法。命名空间有什么问题?所述应用程序具有版本模块,因此我有“全局”变量,如version.VERSION、version.PACKAGE_NAME等
version.VERSION
version.PACKAGE_NAME
你不能那样做。必须明确地将常量导入到每个模块的命名空间中。实现这一点的最佳方法是在“配置”模块中定义常量,并将其导入所需的任何位置:
# mypackage/config.py MY_CONST = 17 # mypackage/main.py from mypackage.config import *
你应该可以把它们放进__init__.py。一直都是这样。
mypackage/__init__.py:
mypackage/__init__.py
MY_CONSTANT = 42
mypackage/mymodule.py:
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,…)中是合理的(可能是最佳实践),然后如果您希望它们位于包名称空间中,则导入它们。
from mypackage.constants import *
不过,这不会自动在包模块的名称空间中包含常量。包中的每个模块仍然必须显式地从mypackage或mypackage.constants导入常量。
mypackage
mypackage.constants
您可以从任何地方定义全局变量,但这是一个非常糟糕的主意。导入
__builtin__
模块并修改或添加此模块的属性,突然您就有了新的内置常量或函数。事实上,当我的应用程序安装gettext时,我在所有模块中都得到了u()函数,而没有导入任何内容。所以这是可能的,但当然只适用于应用程序类型的项目,而不适用于可重用的包或模块。我想没人会推荐这种做法。命名空间有什么问题?所述应用程序具有版本模块,因此我有“全局”变量,如
version.VERSION
、version.PACKAGE_NAME
等你不能那样做。必须明确地将常量导入到每个模块的命名空间中。实现这一点的最佳方法是在“配置”模块中定义常量,并将其导入所需的任何位置:
你应该可以把它们放进
__init__.py
。一直都是这样。mypackage/__init__.py
:mypackage/mymodule.py
:然后,导入mymodule:
不过,如果您确实有常量,那么将它们放在一个单独的模块(constants.py,config.py,…)中是合理的(可能是最佳实践),然后如果您希望它们位于包名称空间中,则导入它们。
mypackage/__init__.py
:不过,这不会自动在包模块的名称空间中包含常量。包中的每个模块仍然必须显式地从
mypackage
或mypackage.constants
导入常量。相关问题 更多 >
编程相关推荐