Pythonにおいて辞書(dict)のvalueはdictを含むことができる。
例えば、first_dict['second'] = second_dict
で、second_dict['mykey']
の値を取りたいときは first_dict['second']['mykey']
とすればよい。しかし、これだと’second’というキーが存在しないときにエラーが起きる。(KeyError)
if 'second' not in first_dict.keys():
return None
if 'mykey' not in first_dict['second'].keys():
return None
return first_dict['second']['myKey']
とすればエラーは起きないが冗長なので、これと同じことをより簡潔な記述で実現したい。
tl;dr
first_dict.get('second', {}).get('mykey')
このようにすれば良い。
dict の get メソッド
dictの get
メソッドはキーが存在しないときデフォルト値の None
を返す。キーが存在するか分からないときに便利。
hoge = mydict.get('hogekey')
これで、hogeには’hogekey’というキーが存在するなら、その値(value)が入る。存在しないならNoneが入る。もちろん、 KeyError
は発生しない。
デフォルト値はNone以外にすることも可能で、第二引数に入れた値が返ってくることになる。次の例では、キーが存在しないときは None
ではなく 'default'
が入ることになる。
hoge = mydict.get('hogekey', 'default')
get メソッドを重ねる
では、今回のネストされた辞書型(dict)のケースでは、単純にgetを2つ使えばよいのかというとそうもいかない。確かに KeyError
は起きなくなるのだが、代わりに TypeError
の可能性がある。
first_dict.get('second').get('mykey')
上の例では、first_dict
に 'second'
キーがあり、それがdictならばmykeyの存在にかかわらずエラーは起きない。しかし、'second'
キーがない場合、None.get('mykey')
となり、TypeError
が発生する。
これを解決するには、デフォルト値を空dictにする。
first_dict.get('second', {}).get('mykey')
secondキーが存在しないときは、空のdictを返すようにすると、{}
にはもちろん 'mykey'
は含まれていないので、{}.get('mykey')
はNoneを返す。エラーは発生しない。
second_dictにmykeyが存在しないのと、そもそもsecond_dictが存在しないのを同一視したいときは便利だと思う。
ちなみに、最近の言語だと、 first.second?.third
みたいな演算子がある。