Why derivated exception can not be pickled ?

2012-09-04 Thread Mathieu Courtois
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 ?

2012-09-05 Thread Mathieu Courtois
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 ?

2012-09-05 Thread Mathieu Courtois
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