Answers:
您应该能够将它们放入__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
不过,如果您确实有常量,将它们放在单独的模块(constants.py,config.py,...)中,然后将其放入包名称空间中是合理的(可能是最佳做法),然后导入他们。
mypackage/__init__.py
:
from mypackage.constants import *
尽管如此,这并不会自动在包模块的命名空间中包含常量。包中的每个模块仍然必须从mypackage
或从中显式导入常量mypackage.constants
。
from mypackage.constants import *
将MY_CONSTANT
在每个子模块中放置的副本,而不是引用相同的变量
MY_CONSTANT
在任何模块中进行突变,它将在所有地方进行突变。如果您要重新分配MY_CONSTANT
任何模块,则只会影响该模块。如果您打算这样做,则必须按属性进行引用,即mypackage.constants.MY_CONSTANT
。
mymodule.py
在此__init__.py
之前导入MY_CONSTANT = 42
,将失败,因为mymodule.py
MY_CONSTANT
尚未定义何时导入。因此,需要移至MY_CONSTANT = 42
上方import mymodule
你不能这样做。您必须将常量明确地导入每个模块的命名空间中。实现此目的的最佳方法是在“ config”模块中定义常量,并将其导入所需的任何位置:
# mypackage/config.py
MY_CONST = 17
# mypackage/main.py
from mypackage.config import *
sys.modules
。
您可以在任何地方定义全局变量,但这是一个非常糟糕的主意。导入__builtin__
模块并修改或向该模块添加属性,突然间您有了新的内置常量或函数。实际上,当我的应用程序安装gettext时,我在所有模块中都获得了_()函数,而无需导入任何内容。因此这是可能的,但当然仅适用于应用程序类型的项目,而不适用于可重用的包或模块。
而且我想没人会推荐这种做法。命名空间有什么问题?说应用程序版本模块,这样我可以有像“全局”变量version.VERSION
,version.PACKAGE_NAME
等等。
只是想补充一点,可以使用config.ini文件使用常量,并使用configparser库在脚本中对其进行解析。这样,您可以在多种情况下使用常量。例如,如果您有两个单独的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
from . import MY_CONSTANT