我正在嘗試使通用配置,因此配置解析器。有兩個配置文件說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