我正在尝试使通用配置,因此配置解析器。有两个配置文件说A和B.我想解析部分并根据硬编码列表从它们制作全局值。Python从列表中创建动态全局变量
下面是一个例子:
在配置文件中:
[section]
var1 = value1
var2 = value2
在全球范围:
some_global_list = [ ["var1","var2"], ["var3","var4"] ]
在函数解压此值,用ConfigParser:
configparser = ConfigParser.RawConfigParser()
configparser.read(some_config_filename)
for variables in some_global_list:
globals()[section]=dict()
for element in configparser.items(section):
globals()[section].update({element[0]:element[1]})
此作品很好... 但是。全局变量()的范围似乎仅限于函数,这显然不是我想要的。我只能在该函数中访问变量。
有人可以分享更好但简单的想法吗? 我知道我可能会将代码移到main而不用担心,但我不认为这是个好主意。 我也想过做一些发生器(对不起,这里伪代码):
在全球范围内:
for x in some_global_list:
globals()[x] = x
也尝试添加这功能:
for x in some_global_list[0]:
global x
,但毫无进展。
编辑:
下面的讨论后,在这里它是:
问题解决了是这样的:
- 除去从主脚本整体配置模块
- 进口(从模块导入somefunction )配置从模块
- 删除globals()实际上并不需要它们,因为功能有点像这样改变:
:
def somefunction:
#(...)
configparser = ConfigParser.RawConfigParser()
configparser.read(some_config_filename)
temp_list=[]
for variables in some_global_list:
tmp=dict()
for element in configparser.items(section):
tmp.update({element[0]:element[1]})
temp_list.append (tmp)
return temp_list #this is pack for one file.
现在在主脚本
tmp=[]
for i,conf_file in enumerate([args.conf1,args.conf2,args.conf3]):
if conf_file:
try:
tmp.append([function(params...)])
except:
#handling here
#but since i needed those config names as global variables
for j,variable_set in enumerate(known_variable_names[i]):
globals()[variable_set] = tmp[i][j]
如此不幸黑客presists。但似乎工作。 Thx为你的帮助家伙。
我接受(如果多数民众赞成可能)以下的答案,因为它给了我不错的主意:)
停止使用全局变量并使用'dict()'来保存段?很少有需要在'globals()'中插入。 – 2013-04-11 11:18:55
我读入字典(),但我想,每节是全球性的字典,如: VAR1 =字典()和 VAR1 =值 – brainovergrow 2013-04-11 11:20:38
是的,我明白你想做的事,我说你不应该”是什么吨做那个,期间。如果你的用户在配置文件中添加了一个名为'configparser'的部分呢?您现在让一个用户控制的配置文件破坏您的代码。 – 2013-04-11 11:21:09