避免 KeyError 异常

使用字典时常见的一个缺陷是访问不存在的密钥。这通常会导致 KeyError 异常

mydict = {}
mydict['not there']
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'not there'

避免键错误的一种方法是使用 dict.get 方法,该方法允许你指定在缺少键时返回的默认值。

value = mydict.get(key, default_value)

如果存在则返回 mydict[key],否则返回 default_value。请注意,这不会将 key 添加到 mydict。因此,如果要保留该键值对,则应使用 mydict.setdefault(key, default_value),它存储键值对。

mydict = {}
print(mydict)
# {}
print(mydict.get("foo", "bar"))
# bar
print(mydict)
# {}
print(mydict.setdefault("foo", "bar"))
# bar
print(mydict)
# {'foo': 'bar'}

处理问题的另一种方法是捕获异常

try:
    value = mydict[key]
except KeyError:
    value = default_value

你还可以检查密钥是否为字典。

if key in mydict:
    value = mydict[key]
else:
    value = default_value

但请注意,在多线程环境中,可以在检查后从字典中删除密钥,从而创建一个仍然可以抛出异常的竞争条件。

另一个选择是使用 dict 的子类 collections.defaultdict,它有一个 default_factory,在给定 new_key 时在 dict 中创建新条目。