Pickling a class with a __getattr__

Peter Otten __peter__ at web.de
Sun Apr 1 12:48:52 EDT 2007


Peter Bengtsson wrote:

> Hi, I'm trying to pickle an object instance of a class that is like a
> dict but with a __getattr__ and I'm getting pickling errors.

> This is what happens when I'm trying to be clever:
> 
>>>> import cPickle as pickle
>>>> class Dict(dict):
> ...     def __getattr__(self, key):
> ...             return self.__getitem__(key)
> ...
>>>> friend = Dict(name='Zahid', age=40)
>>>> friend
> {'age': 40, 'name': 'Zahid'}
>>>> friend.name
> 'Zahid'
>>>> v=pickle.dumps(friend)
> Traceback (most recent call last):
>   File "<stdin>", line 1, in ?
>   File "/usr/lib/python2.4/copy_reg.py", line 73, in _reduce_ex
>     getstate = self.__getstate__
>   File "<stdin>", line 3, in __getattr__
> KeyError: '__getstate__'
> 
> 
> Why can't I pickle the slightly more featurefull class there called
> 'Dict'? 

Because you allow your __getattr__() implementation to raise the wrong kind
of exception.

>>> from cPickle import dumps, loads
>>> class Dict(dict):
...     def __getattr__(self, key):
...             try:
...                     return self[key]
...             except KeyError:
...                     raise AttributeError
...
>>> friend = Dict(name="Zaphod", age=42)
>>> v = dumps(friend)
>>> p = loads(v)
>>> p
{'age': 42, 'name': 'Zaphod'}

Peter



More information about the Python-list mailing list