On 7-12-2009 10:12, Peter Otten wrote:

So there are 2 problems: the pickle protocol isn't used when exception
objects (or instances of classes derived from Exception) are pickled, and
during unpickling, it then
crashes because it calls __init__  with the wrong amount of parameters.
(why is it bothering with __init__ anyway? Aren't exceptions new style
classes?)

The __reduce__() method is called when you pickle an object. It returns an
argument tuple and a factory. For exceptions that factory is the class which
is why __init__() is called when the object is unpickled.

I didn't realize exceptions are treated as "objects pickle know nothing about" (or 'extension types'). They weren't in Python 2.4 at least :)

So I was expecting them to follow the pickle protocol for normal Python types, and didn't look past __getnewargs__ and __getinitargs__...


This started happening in Python 2.5, Python 2.4 works without error.

What is causing this?

I think Exceptions need special treatment because they have state that is
not stored in the instance __dict__.

How can I best solve this error?

You could override __reduce__() to call __getstate__(). I don't see the need
for __getnewargs__() because exceptions aren't immutable.

Peter

Thanks, that was enlightening.
I never had to deal with __reduce__ before :)

--irmen


--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to