1

単純なテキスト ファイルから変数を読み取って、Python で変数を定義したいと考えていました。そのため、ConfigParser、ConfigObj、PyYaml、および JSON についていくつか読みました。現在、特に ConfigObj と PyYaml に興味があります。しかし、自分のやりたいことをきれいに実行することはまだできていません。

ConfigObj と PyYaml を使用すると、外部テキスト ファイルで定義されているすべてのものを辞書に読み込むことができます。すべてのキーと値のペアを抽出し、それらを個別の変数としてインタラクティブなワークスペースに保存することで、この辞書を進めたいと思います。

これは、私がこれまで使用してきた PyYaml の方法です。

import yaml

config_file = open('myFile', 'r')
config = yaml.read(config_file)

keys = config.keys()
values = config.values()

for i in range(len(keys)):
    string = keys[i] + '=' + str(values[i])
    eval(string)

evalあらゆる種類の悪意のあることが起こる可能性があるため、使用は時々眉をひそめます。したがって、PyYaml および/または ConfigObj に上記を実現する組み込み関数があるかどうかを知りたいですか?

4

2 に答える 2

2

私があなたの質問を正しく理解していると仮定すると、以下はあなたが望むことをするはずです。

注: 上書きする前にキーの存在を確認し、それ以外の場合は少し異なる名前を付けます。

import yaml

config_file = open('myFile', 'r')
config = yaml.read(config_file)

keys = config.keys()
values = config.values()

for key,val in zip(keys,values):
    if key not in locals():
        locals()[key] = val
    else:
        locals()[key+"_yaml"] = val

これは機能しますが、実際には、自分の値を辞書に入れることに固執することをお勧めします。ローカル変数が存在しない場合に辞書を参照することの何が問題になっていますか?

于 2013-07-26T05:30:35.893 に答える
1

もし、あんたが

import __main__

その後、あなたはすることができます

__main__.__dict__[keys[i]] = values[i]

あるいは

__main__.__dict__.update(config)

それが賢明かどうかは、グローバル関数が yaml エントリによって上書きされたときに驚かされることにどれだけ価値があるかによって大きく異なります。

于 2013-07-26T05:14:57.347 に答える