2013-07-30 40 views
13

因此,defaultdict documentation提到,如果缺少一個項目,default_factory「返回的值被插入到密鑰字典中,並返回。」這在大多數情況下都很棒,但我在這種情況下實際需要的是返回值,但將而不是插入defaultdict。Python defaultdict不插入缺失值

我想我可以繼承defaultdict並重寫...我想__missing__?不確定。什麼是最好的方式去做這件事?

在此先感謝。

回答

13

你也可以繼承dict和實施__missing__

class missingdict(dict): 
    def __missing__(self, key): 
     return 'default' # note, does *not* set self[key] 

演示:

>>> d = missingdict() 
>>> d['foo'] 
'default' 
>>> d 
{} 

可能defaultdict過,你會得到廠家的處理中拋出加拷貝和鹹菜支持:

from collections import defaultdict 

class missingdict(defaultdict): 
    def __missing__(self, key): 
     return self.default_factory() 

演示:

>>> from collections import defaultdict 
>>> class missingdict(defaultdict): 
...  def __missing__(self, key): 
...   return self.default_factory() 
... 
>>> d = missingdict(list) 
>>> d['foo'] 
[] 
>>> d 
defaultdict(<type 'list'>, {}) 

但是,正如你所看到的,__repr__不會撒謊,它的名字。

+0

這很完美。我可能會使用defaultdict路線來獲得副本支持。謝謝! – Chad

+0

我可以爲'd.pop(「unloaded_key」)'設置一個默認值嗎? – lerner

+1

@Lerner:'dict.pop()'接受默認的第二個參數。 'dict.pop()'不會像大多數其他方法那樣查詢'__missing__';只有'dict .__ getitem__'確實(所以'd [missingkey]')。 –