2013-07-30 15 views
13

Tak więc defaultdict documentation wspomina, że ​​jeśli brakuje jakiegoś elementu, wartość zwrócona przez default_factory "jest wstawiona do słownika dla klucza i zwrócona." To świetnie przez większość czasu, ale w rzeczywistości chcę, aby wartość została zwrócona, ale nie wstawiono do defaultdict.Python defaultdict nie wstawia brakujących wartości

Pomyślałem, że mogę prawdopodobnie podklasy defaultdict i przesłonić ... Chyba __missing__? Niepewny. Jaki jest najlepszy sposób na rozwiązanie tego problemu?

Z góry dziękuję.

Odpowiedz

13

Można podklasy dict i wdrożenie __missing__:

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

Demo:

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

Ty mógł podklasa defaultdict też, że masz plusa obsługi kopiowania i marynowane wsparcia rzucone w fabryki :

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

ale, jak widać, __repr__ kłamie o jego nazwę.

+0

To jest idealne. Prawdopodobnie pójdę z trasą defaultdict, aby uzyskać wsparcie dla kopii. Dzięki! – Chad

+0

Czy mogę ustawić wartość domyślną dla 'd.pop (" unloaded_key ")'? – lerner

+1

@Lerner: 'dict.pop()' przyjmuje drugi argument za domyślny. 'dict.pop()' nie * nie * konsultuje '__missing__', podobnie jak większość innych metod; tylko 'dict .__ getitem__' ma (więc' d [missingkey] '). –

Powiązane problemy