import collections # requires Python 2.7 -- see note below if you're using an earlier version
def merge_dict(d1, d2):
"""
Modifies d1 in-place to contain values from d2. If any value
in d1 is a dictionary (or dict-like), *and* the corresponding
value in d2 is also a dictionary, then merge them in-place.
"""
for k,v2 in d2.items():
v1 = d1.get(k) # returns None if v1 has no value for this key
if ( isinstance(v1, collections.Mapping) and
isinstance(v2, collections.Mapping) ):
merge_dict(v1, v2)
else:
d1[k] = v2
Python 2.7以降を使用していない場合はisinstance(v, collections.Mapping)
、isinstance(v, dict)
(厳密な型付けの場合)またはhasattr(v, "items")
(ダックタイピングの場合)に置き換えます。
一部のキーに競合がある場合(つまり、d1に文字列値があり、d2にそのキーのdict値がある場合)、この実装はd2からの値を保持するだけであることに注意してください(と同様update
)