如何在Python中的不同模块上全局设置变量?

时间:2018-09-20 18:38:24

标签: python

我有一个小项目,在这里我需要首先引入并使用大量变量。

很明显,我可以创建一些配置文件,在其中设置变量的所有值。我只制作了一些Python文件,在其中提供了值:

value_a = 'something'
value_b = 'something'
value_c = 5.0

并调用文件conf.py。当我执行from conf import *时,所有变量的值都已初始化。

尽管如此,我在项目中有不同的模块,它们具有不同的子例程(方法),并且我想让conf.py中的所有值在每种方法和每个模块中都是已知的。

很显然,我可以在每个模块中和每个子例程中from conf import *中进行操作,但这是实现变量初始化的最佳方法吗?

3 个答案:

答案 0 :(得分:2)

使用您所描述的模块是一种设置脚本配置值的可行方法,但是出于某些原因,您可能最好选择其他方法。

  • 评论中的其他一些指出,import *令人厌烦,因为它使根名称空间杂乱无章,并带有许多变量名,从而更容易出现名称冲突。从组织的角度来看,将其保留在模块名称下(例如:conf.varname)有助于跟踪名称并防止冲突。

  • 如果计划分发需要配置的代码,则使用.py模块可将您的代码开放给任意执行该文件中所键入内容的代码。在这里,“。ini .json .cfg等”文件非常有用。通过使用通用格式(例如json)来增加的好处是,如果同事使用其他语言但需要在同一项目上工作,则可以轻松地将配置移植到其他语言。在我脑海中,python包含了.xml .json.ini文件的库。

答案 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提到的另一种平面文件方法。