default behavior

Ethan Furman ethan at stoneleaf.us
Tue Aug 3 18:07:01 EDT 2010


John Posner wrote:
> On 8/3/2010 12:54 PM, Ethan Furman wrote:
> 
> <snip>
> 
>> I think mentioning how __missing__ plays into all this would be helpful.
>> Perhaps in the first paragraph, after the colon:
>>
>> if a key does not currently exist in a defaultdict object, __missing__
>> will be called with that key, which in turn will call a "default value
>> factory" to provide a value for that key.
> 
> Thanks, Ethan. As I said (or at least implied) to Christian earlier in 
> this thread, I don't want to repeat the mistake of the current 
> description: confusing the functionality provided *by* the defaultdict 
> class with underlying functionality (the dict type's __missing__ 
> protocol) that is used in the definition of the class.

I just went and read the entry that had the bogus claim -- personally, I 
didn't see any confusion.  I would like to point out the __missing__ is 
*not* part of dicts (tested on 2.5 and 2.6 -- don't have 2.7 installed yet).

Having said that, I think your final paragraph is better than my first 
paragraph edit.

> So I'd rather not mention __missing__ in the first paragraph, which 
> describes the functionality provided *by* the defaultdict class. How 
> about adding this para at the end:
> 
>  defaultdict is defined using functionality that is available to *any*
>  subclass of dict: a missing-key lookup automatically causes the
>  subclass's __missing__ method to be called, with the non-existent key
>  as its argument. The method's return value becomes the result of the
>  lookup.
> 
> BTW, I couldn't *find* the coding of defaultdict in the Python 2.6 
> library. File collections.py contains this code:
> 
>   from _abcoll import *
>   import _abcoll
>   __all__ += _abcoll.__all__
> 
>   from _collections import deque, defaultdict
> 
> ... but I ran into a dead end after that. :-(  I believe that the 
> following *could be* the definition of defaultdict:
> 
> class defaultdict(dict):
>     def __init__(self, factory, *args, **kwargs):
>         dict.__init__(self, *args, **kwargs)
>         self.default_factory = factory
> 
>     def __missing__(self, key):
>         """provide value for missing key"""
>         value = self.default_factory() # call factory with no args
>         self[key] = value
>         return value

I think it's more along these lines:

class defaultdict(dict):
     def __init__(self, factory=None, *args, **kwargs):
         dict.__init__(self, *args, **kwargs)
         self.default_factory = factory

     def __missing__(self, key):
         "provide value for missing key"
         if self.default_factory is None:
             raise KeyError("blah blah blah")
         value = self.default_factory()
         self[key] = value
         return value

~Ethan~



More information about the Python-list mailing list