Why derivated exception can not be pickled ?
Here is my example :
import cPickle
ParentClass = object # works
ParentClass = Exception # does not
class MyError(ParentClass):
def __init__(self, arg):
self.arg = arg
def __getstate__(self):
print '#DBG pass in getstate'
odict = self.__dict__.copy()
return odict
def __setstate__(self, state):
print '#DBG pass in setstate'
self.__dict__.update(state)
exc = MyError('IDMESS')
fo = open('pick.1', 'w')
cPickle.dump(exc, fo)
fo.close()
fo = open('pick.1', 'r')
obj = cPickle.load(fo)
fo.close()
1. With ParentClass=object, it works as expected.
2. With ParentClass=Exception, __getstate__/__setstate__ are not called.
Does anyone explain me why ?
Thanks.
--
http://mail.python.org/mailman/listinfo/python-list
Re: Why derivated exception can not be pickled ?
Thanks for your reply On Wednesday, September 5, 2012 8:02:55 AM UTC+2, Dieter Maurer wrote: > > The pickle interface is actually more complex and there are several > > ways an object can ensure picklability. For example, there is > > also a "__reduce__" method. I suppose, that "Exception" defines methods > > which trigger the use of an alternative picklability approach (different > > from "__getstate__/__setstate__"). You're right: Exception has __reduce__ & __reduce_ex__ methods. Always read carefully the manual ;-) I must override these methods. MC -- http://mail.python.org/mailman/listinfo/python-list
Re: Why derivated exception can not be pickled ?
Hello, The simple example works fine using __reduce__: class MyError(Exception): def __init__(self, arg): self.arg = arg def __reduce__(self): return (MyError, (self.arg, )) -- http://mail.python.org/mailman/listinfo/python-list
