私は一般的な構成を作成しようとしているため、構成パーサーを作成しています。AとBという2つの構成ファイルがあります。セクションを解析し、ハードコードされたリストに従ってそれらからグローバル値を作成したいと思います。
次に例を示します。
設定ファイルで:
[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]})
これはうまく機能します...しかし。globals() のスコープは、明らかに意図したものではない関数に限定されているようです。その関数内でのみ変数にアクセスできます。
誰かがより良いがシンプルなアイデアを共有できますか? コードをメインに移動しても心配ないことはわかっていますが、それは良い考えではないと思います。いくつかのジェネレーターを作成することも考えました(ここでは疑似コードで申し訳ありません):
グローバル スコープ:
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]
とても残念なハックが存在します。しかし、うまくいくようです。あなたの助けに感謝します。
良いアイデアが得られたので、(可能であれば)以下の回答を受け入れます:)