我可以使用__init__.py来定义全局variables吗?
我想定义一个常量,它应该在包的所有子模块中可用。 我以为最好的地方是在根包的__init__.py
文件中。 但我不知道该怎么做。 假设我有几个子包,每个包都有几个模块。 我怎样才能从这些模块访问该variables?
当然,如果这是完全错误的,还有更好的select,我想知道。
你应该可以把它们放在__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
尽pipe如此,如果你有常量,把它们放在一个单独的模块(constants.py,config.py,…)中是合理的(最好的做法),然后如果你想在包名称空间中导入它们,import他们。
mypackage/__init__.py
:
from mypackage.constants import *
不过,这并不会自动在包模块的名称空间中包含常量。 包中的每个模块仍然需要从mypackage
或mypackage.constants
明确地导入常量。
你不能这样做。 你将不得不明确地将你的常量导入到每个模块的名字空间中。 实现这一目标的最好方法是在“configuration”模块中定义常量并将其导入到需要的地方:
# mypackage/config.py MY_CONST = 17 # mypackage/main.py from mypackage.config import *
你可以从任何地方定义全局variables,但这是一个非常糟糕的主意。 导入__builtin__
模块,并修改或添加属性到这个模块,突然你有新的内build常量或函数。 事实上,当我的应用程序安装gettext时,我的所有模块中都有_()函数,而不需要导入任何东西。 所以这是可能的,但当然只适用于应用程序types的项目,不适用于可重用的包或模块。
我想没有人会推荐这种做法。 命名空间有什么问题? 所述应用程序具有版本模块,以便我具有“全局”variables,如version.VERSION
, version.PACKAGE_NAME
等。
只是想补充一点,可以使用config.ini文件来使用常量,并使用configparser库在脚本中进行parsing。 这样你可以有多种情况下的常量。 例如,如果你有两个单独的url请求的参数常量,就像这样标记它们:
mymodule/config.ini [request0] conn = 'admin@localhost' pass = 'admin' ... [request1] conn = 'barney@localhost' 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