2013-07-30 3 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() 

Demo:

>>> 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()' will * not * consult '__missing__', как и большинство других методов; только 'dict .__ getitem__' делает (так' d [missingkey] '). –