如何使变量在Python中的不同模块上成为全局变量?

如何使变量在Python中的不同模块上成为全局变量?,python,Python,我有一个小项目,我需要首先介绍和使用一些相当多的变量 显然,我可以创建一些配置文件,在其中设置变量的所有值。我只制作了一些Python文件,其中我给出了一些值: value_a = 'something' value_b = 'something' value_c = 5.0 并调用文件conf.py。当我从conf import*执行操作时,我初始化了所有具有值的变量 然而,我在项目中有不同的模块和不同的子例程(其中的方法),我希望在每个方法和每个模块中都知道conf.py中的所有值 显然,

我有一个小项目,我需要首先介绍和使用一些相当多的变量

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

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

并调用文件
conf.py
。当我从conf import*执行
操作时,我初始化了所有具有值的变量

然而,我在项目中有不同的模块和不同的子例程(其中的方法),我希望在每个方法和每个模块中都知道
conf.py
中的所有值


显然,我可以在每个模块中执行
从conf import*
和/或在每个子例程中执行
导入conf
,但这是实现变量初始化的最佳方法吗

使用您描述的模块是为脚本设置配置值的一种可行方法,但有几个原因可以让您更好地使用其他模块

  • 评论中的其他一些人指出,
    import*
    不受欢迎,因为它将根命名空间与大量变量名混在一起,从而更容易发生名称冲突。将它们保存在模块名称下(例如:
    conf.varname
    )有助于从组织的角度跟踪名称并防止冲突

  • 如果您计划分发需要配置的代码,请使用
    .py
    模块打开您的代码,以便对该文件中键入的任何内容执行任意代码。这就是“.ini.json.cfg等”文件非常有用的地方。使用通用格式(如json)的额外好处是,如果同事使用不同的语言,但需要在同一项目中工作,则可以轻松地将配置移植到其他语言。在我的脑海中,python包含了和文件的库


使用您描述的模块是为脚本设置配置值的一种可行方法,但有几个原因可以让您更好地使用其他模块

  • 评论中的其他一些人指出,
    import*
    不受欢迎,因为它将根命名空间与大量变量名混在一起,从而更容易发生名称冲突。将它们保存在模块名称下(例如:
    conf.varname
    )有助于从组织的角度跟踪名称并防止冲突

  • 如果您计划分发需要配置的代码,请使用
    .py
    模块打开您的代码,以便对该文件中键入的任何内容执行任意代码。这就是“.ini.json.cfg等”文件非常有用的地方。使用通用格式(如json)的额外好处是,如果同事使用不同的语言,但需要在同一项目中工作,则可以轻松地将配置移植到其他语言。在我的脑海中,python包含了和文件的库


在我看来,我将针对该问题实施的解决方案是,如您所说,创建一个
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'],
           ...
           }

您需要避免使用某个_moduleimport*
语句中的
,因为您可以将大量导入放入命名空间中,而且对于导入的内容并不明确。因此,在_package.conf import globals的每个模块顶部执行
,您可以使用它,而无需显式导入要使用的每个变量,也无需导入整个模块。我更喜欢这种解决方案,如果您使用json文件存储全局变量的信息,然后在导入所需模块之前在conf.py模块中读取并序列化它们,也会更好。

在我看来,我将针对该问题实施的解决方案是创建
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'],
           ...
           }

您需要避免使用某个_moduleimport*
语句中的
,因为您可以将大量导入放入命名空间中,而且对于导入的内容并不明确。因此,在_package.conf import globals的每个模块顶部执行
,您可以使用它,而无需显式导入要使用的每个变量,也无需导入整个模块。我更喜欢这种解决方案,如果您使用json文件存储全局变量的信息,然后在导入到所需模块之前在conf.py模块中读取并序列化这些变量,也会更好。

我通常同意@@Aaron。他概述的内容非常通用/便携且安全

由于
import*
是一种反模式,您可以轻松地执行
import config
,然后引用其值,如
config.varname


我认为在需要时可以使用
.py
文件。Aaron的观点很好,但只要配置由运行应用程序的人控制,就没有安全问题。允许使用
.py
文件的主要原因是某些配置项需要从其他配置项派生,或者在运行时查找/加载。如果不需要(配置是100%平面和静态的),那么
.json
或Aaron提到的其他平面文件方法将是最好的。

我大体上同意@Aaron。他概述的内容非常通用/便携且安全

由于
import*
是一种反模式,您可以轻松地执行
import config
,然后引用其值,如
config.varname

我想可以