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