problems with shelve(), collections.defaultdict, self

Ian Kelly ian.g.kelly at gmail.com
Sat Feb 11 12:54:58 EST 2012


On Sat, Feb 11, 2012 at 10:46 AM, Ian Kelly <ian.g.kelly at gmail.com> wrote:
> The problem is that defaultdict defines a custom __reduce__ method
> which is used by the pickle protocol to determine how the object
> should be reconstructed.  It uses this to reconstruct the defaultdict
> with the same default factory, by calling the type with a single
> argument of the default factory.  Since your subclass's __init__
> method takes no arguments, this results in the error you see.
>
> There are a couple of ways you could fix this.  The first would be to
> change the signature of the __init__ method to take an optional
> argument accepting the default factory instead of hard-coding it, like
> this:
>
>    def __init__(self, default_factory=int):
>        super().__init__(default_factory, Joe=0)
>
> The other would be to just fix the __reduce__ method to not pass the
> default factory to your initializer, since it is hard-coded.  That
> would look like this:
>
>    def __reduce__(self):
>        return (type(self), ())

It occurs to me that there's also an option 3: you don't really need a
defaultdict to do what you're trying to do here.  You just need a dict
with a custom __missing__ method.  That could look something like
this:

class Dog(dict):

    def __missing__(self):
        return 0

And then you don't have to worry about the weird pickle behavior of
defaultdict at all.

Cheers,
Ian



More information about the Python-list mailing list