2009-05-05 20 views
12

私は自分自身(そしてそれを気にしている人は誰でも)PythonのPythonで少し定型のライブラリを作るというアイデアを思いついています。アプリケーションの設定にyamlファイルが用意されているシステムが必要です。YamlがPythonでマージする

私は、ライブラリがデフォルトのyamlツリーを提供し、それをユーザが提供したものとマージした場合に役立つと思っていました。ユーザがyamlを指定したときにデフォルトで重複しているツリーの中で、ユーザが提供するブランチは、ライブラリが提供するものを置き換えます。

yamlを指定したユーザーがデフォルトのツリーと重ならない場合でも、デフォルトのツリーは維持されます。

ユーザが指定したyamlによって提供されるツリー内の任意の超巨大なブランチが追加されます。

私は、この説明がわかりやすく、私が求めていることが明らかであることを知っています。私はそれが自由のために少し得るのではないかと思います。あなたは2つのツリーマージするファイルを解析するためPyYAMLを使用して、以下の機能ができ

+0

デフォルトツリーのリストや設定ツリーの辞書など、競合するタイプをどのように処理する必要がありますか?それはリストをマージするべきですか? –

答えて

21

def merge(user, default): 
    if isinstance(user,dict) and isinstance(default,dict): 
     for k,v in default.iteritems(): 
      if k not in user: 
       user[k] = v 
      else: 
       user[k] = merge(user[k],v) 
    return user 

オプションを、あなたはこの関数を呼び出す前に、ユーザーツリーのdeep-copyを行うことができます。

+0

なぜuser.update(デフォルト)を使用しないのですか? –

+0

dict.updateが既存のキーを上書きするため、これはdefault.update(user)です。ツリーを深く再帰する場所を知るには、結合された辞書を繰り返し処理する必要があります。これは、ユーザーとデフォルトのうちで最大のものと同じかそれ以上です。 –

+2

非常に良い、ありがとう! imhoには配列間のマージがありませんが、キーに[1,2]があり、もう一方のキーに[2,3]がある場合、マージされた要素には[1,2,3]が必要です。私が間違っている? – Riccardo

関連する問題