[IronPython] Bug in Ipy 2.6 when pickling exceptions

Dino Viehland dinov at microsoft.com
Sun Dec 20 11:44:25 PST 2009


CPython does the exact same thing:

Python 2.6.3 (r263rc1:75186, Oct  2 2009, 20:40:30) [MSC v.1500 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> class my_exc(Exception):
...     def __init__(self, message, param):
...             super(my_exc, self).__init__(message)
...             self.param = param
...
>>>
>>> e = my_exc('message','param')
>>> import pickle
>>> pickle.loads(pickle.dumps(e))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Python26\lib\pickle.py", line 1374, in loads
    return Unpickler(file).load()
  File "C:\Python26\lib\pickle.py", line 858, in load
    dispatch[key](self)
  File "C:\Python26\lib\pickle.py", line 1133, in load_reduce
    value = func(*args)
TypeError: __init__() takes exactly 3 arguments (2 given)
>>>

You can override __reduce_ex__ so that it'll match up with your __init__ method:

class my_exc(Exception):
    def __init__(self, message, param):
            super(my_exc, self).__init__(message)
            self.param = param
    def __reduce_ex__(self, protocol):
           return (my_exc, (self.message, self.param))

e = my_exc('message','param')
import pickle
pickle.loads(pickle.dumps(e))

It looks like you should be able to just override __reduce__ but it looks like IronPython calls __reduce_ex__ where CPython calls __reduce__ for some reason.  I've filed that as bug 25731 http://ironpython.codeplex.com/WorkItem/View.aspx?WorkItemId=25731



From: users-bounces at lists.ironpython.com [mailto:users-bounces at lists.ironpython.com] On Behalf Of Idan Zaltzberg
Sent: Sunday, December 20, 2009 2:57 AM
To: users at lists.ironpython.com
Subject: [IronPython] Bug in Ipy 2.6 when pickling exceptions

Hi,
I'm using IronPython 2.6 final.
When deriving from Exception class, and creating a constructor with a different signature (not 1 argument), I get an exception when pickling and unpickling.
Seems like the pickling process "neglects" some of the information so the unpickling fails.
This can be reproduced with:

>>> class my_exc(Exception):
...     def __init__(self, message, param):
...             super(my_exc, self).__init__(message)
...             self.param = param
...
>>> e = my_exc('message','param')
>>> import pickle
>>> pickle.loads(pickle.dumps(e))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Systems\3rd_party\IronPython\2.6\Lib\pickle.py", line 1374, in loads
  File "C:\Systems\3rd_party\IronPython\2.6\Lib\pickle.py", line 858, in load
  File "C:\Systems\3rd_party\IronPython\2.6\Lib\pickle.py", line 1133, in load_reduce
TypeError: __init__() takes exactly 3 arguments (2 given)


Thanks.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.ironpython.com/pipermail/users-ironpython.com/attachments/20091220/c12a624f/attachment-0001.htm>


More information about the Users mailing list