[Python-Dev] BaseException pickle issue

Eric Huss ehuss at ironport.com
Sun Apr 1 01:44:16 CEST 2007

Some subclasses of Exception are no longer pickleable in Python 2.5.  An

class A(Exception):
        def __init__(self, foo):
                self.foo = foo

The key problem here is if you do not somehow set self.args to the correct
arguments (via Exception.__init__ or setting self.args directly), you will
get a TypeError when you try to unpickle it:

TypeError: __init__() takes exactly 2 arguments (1 given)

I do not think this is unusual.  I found a few examples in Python's
standard library that have this problem:

httplib.UnknownProtocol, httplib.IncompleteRead, httplib.BadStatusLine
and on and on...

Does anyone have any thoughts about this?  Is it a bug?

I can imagine one could argue that exceptions should call the base
__init__ method to properly set args, but there are so many exceptions out
there that do not do this that it would be very difficult to track them
all down.

I removed the __reduce__ and __setstate__ methods from BaseException and
everything seems to just work.  Pickling/unpickling works for all
protocols whether or not you set self.args.  Is this an appropriate
solution?  I'm not sure what the motivation for having these methods is.


More information about the Python-Dev mailing list