2013-07-30 11 views
13

Quindi il defaultdict documentation menziona che, se manca un elemento, il valore restituito da default_factory "è inserito nel dizionario per la chiave e restituito." È fantastico la maggior parte delle volte, ma quello che voglio in questo caso è che il valore venga restituito ma non inserito nel predefinito.Python defaultdict che non inserisce i valori mancanti

Ho pensato che potrei probabilmente sottoclasse defaultdict e override ... credo che __missing__? Non sono sicuro. Qual è il modo migliore per farlo?

Grazie in anticipo.

risposta

13

È possibile creare una sottoclasse dict e implementare __missing__:

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

Demo:

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

È potrebbe sottoclasse defaultdict troppo, si otterrebbe la gestione oltre al supporto copia e sottaceto gettato in fabbrica :

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'>, {}) 

ma, come si può vedere, la __repr__ fa si trovano sul suo nome.

+0

Questo è perfetto. Probabilmente andrò con la route defaultdict per ottenere il supporto per la copia. Grazie! – Chad

+0

Posso impostare un valore predefinito per 'd.pop (" unloaded_key ")'? – lerner

+1

@Lerner: 'dict.pop()' accetta un secondo argomento per il valore predefinito. 'dict.pop()' non * consulta * __missing__', come molti altri metodi; solo 'dict .__ getitem__' fa (quindi' d [missingkey] '). –

Problemi correlati