[Python-Dev] BaseException pickle issue

Žiga Seilnacht ziga.seilnacht at gmail.com
Sun Apr 1 15:51:51 CEST 2007


Eric Huss wrote:
> Some subclasses of Exception are no longer pickleable in Python 2.5.  An
> example:
> 
[snip]
> 
> 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.
> 

I think that this is a bug, but removing those methods is not the right
solution.  The __reduce__ method is needed because builtin exceptions
don't store their attributes in the __dict__ anymore; if you remove it,
then those attributes will be lost during pickling.  The __setstate__
method was added to help with unpickling old exceptions, which did store
all their attributes in the __dict__.  See this patch for details:

http://www.python.org/sf/1498571

A better solution would be to move the initial args attribute assignment
to BaseException.__new__.  See this patch:

http://www.python.org/sf/1692335

Could you check if that fixes your problem?

Ziga



More information about the Python-Dev mailing list