Pickling a class with a __getattr__

Peter Bengtsson peterbe at gmail.com
Sun Apr 1 12:38:41 EDT 2007


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 works but is not good enough.

$ python2.4
>>> import cPickle as pickle
>>> class Dict(dict):
...     pass
...
>>>
>>>
>>> friend = Dict(name='Zahid', age=40)
>>> friend
{'age': 40, 'name': 'Zahid'}
>>> v=pickle.dumps(friend)
>>> p=pickle.loads(v)
>>> p
{'age': 40, 'name': 'Zahid'}

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'? I've got my reasons for not going for a simple type dict but
feel that that is irrelevant right now.




More information about the Python-list mailing list