避免 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 中建立新條目。