[英]perplexing python dict.get() behavior with default dict index
[英]python dictionary replace dict[] operator with dict.get() behavior
my_dict = {'a': 1}
我希望my_dict['a']
的行為與my_dict.get('a')
相同,如果我這樣做my_dict['b']
,則不會引發錯誤,但會得到默認的None
值,相同從my_dict.get('b')
獲取它的方式
在my_dict = {'a': {'b': 2}}
我可以執行my_dict['a']['b']
,它將作為my_dict.get('a').get('b')
當my_dict['b'] = 2
其作用與my_dict.update({'b': 2})
是否可以這樣做,而不必從dict繼承?
每次嘗試訪問不存在的鍵時,都可以使用collections.defaultdict()
對象向字典添加新值:
>>> from collections import defaultdict
>>> d = defaultdict(lambda: None)
>>> d['a'] is None
True
>>> d
defaultdict(<function <lambda> at 0x10f463e18>, {'a': None})
如果您不想添加鍵,請創建實現__missing__
方法的dict
的子類:
class DefaultNoneDict(dict):
def __missing__(self, key):
return None
這顯然不會添加新的鍵:
>>> d = DefaultNoneDict()
>>> d['a'] is None
True
>>> d
{}
如果要鏈接 .get()
調用,則必須返回一個空字典,否則dict.get(keyA).get(keyB)
會因屬性錯誤而失敗(返回的第一個None
不會包含.get()
方法)。
一般來說,最好堅持使用默認類型並明確表示。 沒錯:
value = some_d.get(outer, {}).get(inner)
使用帶有自定義__missing__
鈎子的defaultdict
或dict
子類有一個缺點:缺少鍵時,它們總是會產生默認值,即使您在代碼中的其他地方意外地產生了不正確的鍵也是如此。 我經常選擇相對於defaultdict
的顯式dict.get()
或dict.setdefault()
代碼路徑,正是因為我希望一個不存在的鍵在項目的其他部分產生錯誤。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.