Pythonのdictにはupdate([other])メソッドがあり、辞書の内容をotherのキーと値で更新してくれる。既存のキーは上書きされる。

"key1"と"key2"をkeyにもつdictを"key3"でupdateすると、"key3"が追加される。

$ python
Python 2.7.5 (default, Aug  4 2017, 00:39:18)
>>> d = {"key1": "value1", "key2": "value2"}
>>> d.update({"key3": "value3"})
>>> print d
{'key3': 'value3', 'key2': 'value2', 'key1': 'value1'}

すでに"key3"がある状態でupdateすると、"key3"のvalueが上書きされる。

>>> d.update({"key3": "value3 again"})
>>> print d
{'key3': 'value3 again', 'key2': 'value2', 'key1': 'value1'}

特に問題のないメソッドに見えるが、階層構造があるdictの場合、意図した動きをしないかもしれない。

"key1"のvalueが文字列や数値などではなくdictであった場合であっても、updateの動作はvalue自体を上書き更新するのであって、valueの中を階層構造をみてupdateしてくれるわけではない。

>>> d = {"key1": {"key2": "value2", "key3": "value3"}}
>>> d.update({"key1": {"key3": "value3 again"} })
>>> print d
{'key1': {'key3': 'value3 again'}}

# 次のようにはならない!
# {'key1': {'key2': 'value2', 'key3': 'value3 again'}}

ネストしたdictの階層構造をみてupdateする標準のメソッドは用意されていないため、自分で作成しなければならない。
ネストした要素もコピーするdeepcopyに動作が似ているためdeepupdateと名付けるか、あるいはネストした階層構造をupdateするのでnestedupdateと名付けるか、ここではdeepupdateとしたい。

実装は次のようになる。
各key, valueのセットについて、valueがdictであり、かつ元のdictにそのkeyがある場合は、再帰的に更新する。valueがdictでなければ元のdictに追加/更新してしまっていいし、元のdictにそのkeyがなければそのまま追加してしまえばいい。

def deepupdate(dict_base, other):
  for k, v in other.items():
    if isinstance(v, dict) and k in dict_base:
      deepupdate(dict_base[k], v)
    else:
      dict_base[k] = v

dictしかコード上で扱わないのであれば問題ないが、もう少し丁寧に書くとisinstance(v, dict)isinstance(v, collections.Mapping)とした方がより汎用的だろう。

import collections

def deepupdate(dict_base, other):
  for k, v in other.items():
    if isinstance(v, collections.Mapping) and k in dict_base:
      deepupdate(dict_base[k], v)
    else:
      dict_base[k] = v