default behavior

Christian Heimes lists at
Tue Aug 3 23:47:23 CEST 2010

> 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.

Your proposal sounds like a good idea.

By the way do you have a CS degree? Your wording sounds like you are
used write theses on a CS degree level. No offense. ;)

> BTW, I couldn't *find* the coding of defaultdict in the Python 2.6 
> library. File contains this code:
>    from _abcoll import *
>    import _abcoll
>    __all__ += _abcoll.__all__
>    from _collections import deque, defaultdict

defaultdict is implemented in C. You can read up the source code at
. Search for "defaultdict type". The C code isn't complicated. You
should understand the concept even if you are not familiar with the C
API of Python.

> 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

The type also implements __repr__(), copy() and __reduce__(). The latter
is used by the pickle protocol. Without a new __reduce__ method, the
default_factory would no survive a pickle/unpickle cycle. For a pure
Python implementation you'd have to add __slots__ = "default_factory",
too. Otherwise every defaultdict instance would gain an unncessary
__dict__ attribute, too.


More information about the Python-list mailing list