我想定义一个应该在包的所有子模块中可用的常量。我认为最好的地方应该在根包的__init__.py
文件中。但我不知道该怎么做。假设我有几个子包,每个包都有几个模块。我怎样才能从这些模块访问该变量?我可以使用__init__.py来定义全局变量吗?
当然,如果这是完全错误的,并且有更好的选择,我想知道它。
我想定义一个应该在包的所有子模块中可用的常量。我认为最好的地方应该在根包的__init__.py
文件中。但我不知道该怎么做。假设我有几个子包,每个包都有几个模块。我怎样才能从这些模块访问该变量?我可以使用__init__.py来定义全局变量吗?
当然,如果这是完全错误的,并且有更好的选择,我想知道它。
你应该可以把它们放在__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
不过,如果你确实有不变s,将它们放在一个单独的模块(constants.py,config.py,...)中是合理的(最佳实践),然后如果你希望它们位于包名称空间中,请导入它们。
mypackage/__init__.py
:
from mypackage.constants import *
不过,这并不会自动包括在包中的模块的名称空间中的常数。包中的每个模块仍需要明确地从mypackage
或mypackage.constants
导入常量。
你不能那样做。你将不得不明确地将你的常量导入到每个模块的名字空间中。实现这一目标的最好方法是在“配置”模块来定义常量和导入它无处不在,你需要它:
# mypackage/config.py
MY_CONST = 17
# mypackage/main.py
from mypackage.config import *
呀,一个配置文件是什么我想要。我只是认为__init__.py会是一个好地方。 您的解决方案听起来像标准做法。是吗? – 2009-09-05 12:42:50
好点。我没有意识到问题是将常量_automatically_放置在所有包模块的名称空间中。 – 2009-09-05 13:00:03
但每次脚本导入config.py时,都会执行内部代码。如果config.py中的代码只能运行一次,你推荐什么?假设我正在读取config.py中的settings.json文件,并且我不想在每次导入config.py时打开()它。 – Augiwan 2014-07-03 08:12:18
您可以从任何地方定义全局变量,但这是一个非常糟糕的主意。导入__builtin__
模块并修改或添加属性到这个模块,并突然你有新的内建常量或函数。实际上,当我的应用程序安装gettext时,我在所有模块中都得到了_()函数,而不需要导入任何东西。所以这是可能的,但当然只适用于应用程序类型的项目,不适用于可重用的包或模块。
我想没有人会推荐这种做法。命名空间有什么问题?说应用程序版本模块,这样我可以有像version.VERSION
,“全局”变量version.PACKAGE_NAME
等
只是想补充一点,常量可以使用config.ini文件中使用并分析在脚本中使用configparser库。这样你可以有多种情况下的常量。例如,如果你有参数常量,两个独立的URL请求只是贴上标签,像这样:
mymodule/config.ini
[request0]
conn = '[email protected]'
pass = 'admin'
...
[request1]
conn = '[email protected]'
pass = 'dinosaur'
...
我发现Python的网站非常有帮助的文档。我不知道是否有Python 2和3所以这里的任何差别是链接到两个:
对于Python 3:https://docs.python.org/3/library/configparser.html#module-configparser
对于Python 2:https://docs.python.org/2/library/configparser.html#module-configparser
是的,这是有道理的,你必须导入它们。 – 2009-09-05 13:17:13
这应该是被接受的答案。如果你正在使用Python 2.5或更高版本,你也可以使用显式的相对导入以及[在这里]描述的(http://docs.python.org/2/tutorial/modules.html#intra-package-references):从...开始。 import MY_CONSTANT' – ThatAintWorking 2014-02-12 17:17:30
这个答案是正确的,并提供了一个直接的解决方案,而不是一个解决方法。感谢提供这个,它应该是被接受的答案。 +1 – Hazok 2014-09-12 16:58:07