Irmen de Jong wrote: > I am puzzled why Python's exception classes don't seem to follow the > pickle protocol. To be more specific: an instance of a user defined > exception, subclassed from Exception, cannot be pickled/unpickled > correctly in the expected way. > > The pickle protocol says that: > __getinitargs__ is used if you want __init__ to be called for old-style > classes __getnewargs__ is used if you want to pass params to __new__ for > new-style classes __getstate__ is used to determine what to pickle instead > of the objects __dict__ > > None of these are used when pickling Exception objects! > I've pasted some test code at the end of this message that creates a > normal object and an object derived from Exception, and pickles them both. > Then it unpickles them. The output is:
> 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. > 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 -- http://mail.python.org/mailman/listinfo/python-list