我有一个小项目,在这里我需要首先引入并使用大量变量。
很明显,我可以创建一些配置文件,在其中设置变量的所有值。我只制作了一些Python文件,在其中提供了值:
value_a = 'something'
value_b = 'something'
value_c = 5.0
并调用文件conf.py
。当我执行from conf import *
时,所有变量的值都已初始化。
尽管如此,我在项目中有不同的模块,它们具有不同的子例程(方法),并且我想让conf.py
中的所有值在每种方法和每个模块中都是已知的。
很显然,我可以在每个模块中和每个子例程中from conf import *
中进行操作,但这是实现变量初始化的最佳方法吗?
答案 0 :(得分:2)
使用您所描述的模块是一种设置脚本配置值的可行方法,但是出于某些原因,您可能最好选择其他方法。
答案 1 :(得分:1)
我认为,针对该问题,我要实现的解决方案是创建一个conf.py
,如您所说,然后在其中将全局变量定义为字典结构,以便正确组织和易于实现。在将要导入的模块上使用。
例如:
globals = {'value_a': 'something a',
'value_b': 'something b',
'value_c': '5.0',
'allowed_platforms': {
'windows': 'value 1',
'os x': 'value 2',
'linux': 'value 3'
},
'hosts': ['host a', 'host b', 'host c'],
...
}
您需要避免使用from some_module import *
语句,因为您可以将许多导入放入名称空间中,并且因为它对要导入的内容不明确。因此,在每个模块from your_package.conf import globals
的顶部进行操作都可以使用它,而无需显式导入要使用的每个变量,也无需导入整个模块。我更喜欢该解决方案,如果您使用 json 文件存储该全局变量的信息,然后在conf.py模块中读取并序列化它们,然后再导入所需的模块,则可能会更好。
答案 2 :(得分:1)
我通常同意@@ Aaron。他概述的内容非常通用/便携式且安全。
由于import *
是反模式,因此您可以轻松进行{{1}},然后引用其值,例如import config
。
我认为在需要时可以使用config.varname
文件。 Aaron的观点很好,但是只要配置是由运行该应用程序的人控制的,就不会出现安全问题。允许.py
文件的主要原因是某些配置项需要从其他配置项派生,或者需要在运行时查找/加载。如果不需要该配置(配置为100%固定和静态),则最好使用.py
或Aaron提到的另一种平面文件方法。