2016-10-15 6 views
0

yamlファイルから設定をインポートしますが、現在のコンテキストでは通常の変数として使用できます。例えばファイルから設定をインポート

私は、ファイル持っていることがあります。

param1: 12345 

param2: test11 

param3: 
    a: 4 
    b: 7 
    c: 9 

をそして私は、変数param1param2、私のコードでparam3を持っていると思います。

私はこれをどの機能からでも使用したい場合があり、それらをグローバルに使用したくない場合があります。

私は約locals()globals()の機能について聞いたことがありますが、これをどのように使用するかは分かりませんでした。

答えて

0

locals()['newvarname'] = 12345を使用して新しい変数を作成することができます。 ファイルを読み込んで、この構造を希望どおりに入力できます。

あなたはそれとインポート設定を呼び出すための関数を書くことがあります。

import sys 
import yaml 


def get_settings(filename): 
    flocals = sys._getframe().f_back.f_locals # get locals() from caller 
    with open(filename, 'r') as ysfile: 
     ydata = yaml.load(ysfile.read()) 
    for pname in ydata: 
     # assume the yaml file contains dict 
     flocals[pname] = ydata[pname] # merge caller's locals with new vars 
+3

あなたのforループと同じことを 'update()'しないでしょうか? – spectras

+0

良い点、一般的に - はい。しかし、私は私がサブキーも扱い、ソースから関数をコピーしてカットする、私のプロジェクトでもっと拡張されたコードを持っています。 – baldr

0

トリックに@バルドルの答えで素晴らしいですが、私は読みやすくするための機能のうち、変数の割り当てを移動示唆しています。関数を変更すると、呼び出し元のコンテキストが覚えて維持するのが非常に難しいようです。したがって、

import yaml 

def get_settings(filename): 
    with open(filename, 'r') as yf: 
     return yaml.load(yf.read()) 

def somewhere(): 
    locals().update(get_settings('foo.yaml')) 
    print(param1) 

でも、単に辞書を使用することを強くお勧めします。さもなければ、あなたは非常に奇妙なバグを被るでしょう。たとえば、yamlファイルにopenまたはprintというキーが含まれている場合はどうなりますか?それらはPythonの関数をオーバーライドするので、例のprint(param1)TypeError例外を発生させます。

関連する問題