2013-04-11 35 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