階層構造のあるdictをupdateする

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

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

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

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

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

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

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

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

-Python