1

私は一般的な構成を作成しようとしているため、構成パーサーを作成しています。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

しかし、どこにも行きませんでした。

編集 :

以下の議論の後、ここにあります:

問題は次のように解決されます。

  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]

とても残念なハックが存在します。しかし、うまくいくようです。あなたの助けに感謝します。

良いアイデアが得られたので、(可能であれば)以下の回答を受け入れます:)

4

1 に答える 1

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」変数は、アプリケーション内の他のモジュールにインポートできます。

于 2013-04-11T11:38:58.027 に答える