Python bite: キー不在時の辞書の挙動
Tagged:

Python では、 キーを指定して値を取得する「辞書」(あるいは「マッピング」) が言語として提供されています。

dic = { 'a': 'alpha', 'b': 'beta' }
a = dic['a']
"[]" による辞書アクセス

Perl の連想配列や、 Java の java.util.Map 実装クラスの場合、 キーが存在しない場合の挙動は、 基本的に空値(e.g.: null)等を返すようになっていますが、 Python の場合は例外が浮揚します。

> a = dic['unknown']
Traceback (most recent call last):
  File "", line 1, in ?
NameError: name 'unknown' is not defined
不在キーでの辞書アクセス

なまじ他の言語での辞書/マップ使用経験があると咬まれます

例外を抑止するだけなら、 辞書がキーを含んでいることを確認してから取得することで、 実現できるのですが:

if dic.has_key['unknown']:
    a = dic['unknown']
安全な辞書アクセス(性能悪し)

内部的な実現を考えた場合、 unknown に関するハッシュ値計算や索引検索が、 has_key() と [] アクセスの2回実行されることになりますから、 実行性能的によろしくありません。

そこで、キー不在の可能性がある場合、 [] によるアクセスではなく、 get(key[, default]) メソッドによるアクセスをする必要が有ります。

a = dic.get('unknown', None)
安全な辞書アクセス