default behavior

Ethan Furman ethan at stoneleaf.us
Tue Aug 3 12:54:46 EDT 2010


John Posner wrote:
> On 7/31/2010 1:31 PM, John Posner wrote:
>>
>> Caveat -- there's another description of defaultdict here:
>>
>> http://docs.python.org/library/collections.html#collections.defaultdict
>>
>> ... and it's bogus. This other description claims that __missing__ is a
>> method of defaultdict, not of dict.
> 
> Following is a possible replacement for the bogus description. Comments 
> welcome. I intend to submit a Python doc bug, and I'd like to have a 
> clean alternative to propose.
> 
> --------------
> 
> class collections.defaultdict([default_factory[, ...]])
> 
> defaultdict is a dict subclass that can guarantee success on key 
> lookups: if a key does not currently exist in a defaultdict object, a 
> "default value factory" is called to provide a value for that key.  The 
> "default value factory" is a callable object (typically, a function) 
> that takes no arguments. You specify this callable as the first argument 
> to defaultdict(). Additional defaultdict() arguments are the same as for 
> dict().
> 
> The "default value factory" callable is stored as an attribute, 
> default_factory, of the newly created defaultdict object. If you call 
> defaultdict() with no arguments, or with None as the first argument, the 
> default_factory attribute is set to None. You can reassign the 
> default_factory attribute of an existing defaultdict object to another 
> callable, or to None.
> 
> When a lookup of a non-existent key is performed in a defaultdict 
> object, its default_factory attribute is evaluated, and the resulting 
> object is called:
> 
> * If the call produces a value, that value is returned as the result of 
> the lookup. In addition, the key-value pair is inserted into the 
> defaultdict.
> 
> * If the call raises an exception, it is propagated unchanged.
> 
> * If the default_factory attribute evaluates to None, a KeyError 
> exception is raised, with the non-existent key as its argument. (The 
> defaultdict behaves exactly like a standard dict in this case.)

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.

~Ethan~



More information about the Python-list mailing list