我可以使用__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 * 

不过,这并不会自动在包模块的名称空间中包含常量。 包中的每个模块仍然需要从mypackagemypackage.constants明确地导入常量。

你不能这样做。 你将不得不明确地将你的常量导入到每个模块的名字空间中。 实现这一目标的最好方法是在“configuration”模块中定义常量并将其导入到需要的地方:

 # mypackage/config.py MY_CONST = 17 # mypackage/main.py from mypackage.config import * 

你可以从任何地方定义全局variables,但这是一个非常糟糕的主意。 导入__builtin__模块,并修改或添加属性到这个模块,突然你有新的内build常量或函数。 事实上,当我的应用程序安装gettext时,我的所有模块中都有_()函数,而不需要导入任何东西。 所以这是可能的,但当然只适用于应用程序types的项目,不适用于可重用的包或模块。

我想没有人会推荐这种做法。 命名空间有什么问题? 所述应用程序具有版本模块,以便我具有“全局”variables,如version.VERSIONversion.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