我有以下问题:
from collections import defaultdict
def give_it_to_me(d):
# This will crash if key 'it' does not exist
return d['it']
def give_it2_to_me(d):
# This will never crash, but does not trigger the default value in defaultdict
return d.get('it2')
d1 = defaultdict(int)
d2 = { 'it' : 55 }
print give_it_to_me(d1)
print give_it_to_me(d2)
print give_it2_to_me(d1)
print give_it2_to_me(d2)
正如您在评论中所看到的,似乎无法编写give_it_to_me
的版本:
defaultdict
s 或者我错了?
答案 0 :(得分:3)
您的give_it_to_me
功能可能需要更多代码。
使用try
except
语句检查现有密钥。
例如:
def give_it_to_me(d):
# This won't crash if key 'it' does not exist in a normal dict.
# It returns just None in that case.
# It returns the default value of an defaultdict if the key is not found.
try:
return d['it']
except KeyError:
return None
答案 1 :(得分:1)
使用try .. except
:
try
return d['it']
except KeyError:
return None
为什么defaultdict.get
无法正常工作:
defaultdict
是使用__missing__方法实现的。仅当__missing__
键不在字典中时,dict[k]
(或dict.__getitem__(k)
)才会调用k
方法。
defaultdict.__missing__
documentation也提到:
请注意,除了之外的任何操作都不会调用
__missing__()
__getitem__()
。这意味着get()
将像普通词典一样,将None作为默认值而非使用default_factory
返回。