pickle and converting to new-style classes

G

greg.landrum

Hi,

I have a fairly sizable body of python code that I'm in the process of
modernizing.

One of the modernization steps is converting to use new-style classes,
and this is leading to problems with pickle. What's happening is that
part of the test suite for this code includes pickled instances of the
classes I am modifying, attempting to unpickle these objects is
generating errors in certain cases.

A bit of sample code that shows the same problem:
--------------------
import pickle

# original class definition:
class klass:
def __init__(self,v):
self._v=v

# instantiate it:
o = klass(3)
# create a pickle (simulates our saved pickle on disc)
pkl = pickle.dumps(o)

# change the class definition (simulates changing the orginal
# source):
class klass(object):
def __init__(self,v):
self._v=v

# this generates an error:
n = pickle.loads(pkl)
--------------------

There error I get is:
Traceback (most recent call last):
File "newclass.py", line 20, in ?
n = pickle.loads(pkl)
File "c:\Python23\Lib\pickle.py", line 1394, in loads
return Unpickler(file).load()
File "c:\Python23\Lib\pickle.py", line 872, in load
dispatch[key](self)
File "c:\Python23\Lib\pickle.py", line 1084, in load_inst
self._instantiate(klass, self.marker())
File "c:\Python23\Lib\pickle.py", line 1074, in _instantiate
value = klass(*args)
TypeError: in constructor for klass: __init__() takes exactly 2
arguments (1 given)

I realize I'm trying to do something a bit hackish, but re-generating
these pickled instances from scratch would be a rather massive amount
of work, so I'd really like to figure out some way to either
"translate" the pickled instances to work with the new-style class
definitions or to modify the class definition itself so that the
pickles can be loaded (this would be preferable). Is this remotely
possible?

thanks,
-greg
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,769
Messages
2,569,582
Members
45,070
Latest member
BiogenixGummies

Latest Threads

Top