2013-04-11 33 views
0

我正在尝试使通用配置,因此配置解析器。有两个配置文件说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 

,但毫无进展。

编辑:

下面的讨论后,在这里它是:

问题解决了是这样的:

  1. 除去从主脚本整体配置模块
  2. 进口(从模块导入somefunction )配置从模块
  3. 删除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为你的帮助家伙。

我接受(如果多数民众赞成可能)以下的答案,因为它给了我不错的主意:)

+5

停止使用全局变量并使用'dict()'来保存段?很少有需要在'globals()'中插入。 – 2013-04-11 11:18:55

+0

我读入字典(),但我想,每节是全球性的字典,如: VAR1 =字典()和 VAR1 =值 – brainovergrow 2013-04-11 11:20:38

+3

是的,我明白你想做的事,我说你不应该”是什么吨做那个,期间。如果你的用户在配置文件中添加了一个名为'configparser'的部分呢?您现在让一个用户控制的配置文件破坏您的代码。 – 2013-04-11 11:21:09

回答

0

一个简单的方法来解决这个问题是在你的应用程序包中的__init__.py你可以做类似下面的内容:

app_config = read_config() 

def read_config(): 
    configparser = ConfigParser.RawConfigParser() 
    configparser.read(some_config_filename) 
    return configparser.as_dict() #An imaginery method which returns the vals as dict. 

“app_config”变量可以导入到应用程序中的任何其他模块。

+0

我会检查。虽然 - 不确定是否可以通过argparse传递some_config_filename,并避免将所有配置步骤移至__init__;) – brainovergrow 2013-04-11 11:47:14

+0

@brainovergrow您应该考虑将引导程序代码集中到一个实例bootstrap.py的模块中。 – Ifthikhan 2013-04-11 12:06:49

+0

嗯,但如果我模块化这个,我想我会需要两个额外的文件: \ _ \ _ init \ _ \ _。py和bootstrap.py,我是吗? – brainovergrow 2013-04-11 12:15:40