[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