pickling subclasses of dict/list
Edward Loper
edloper at gradient.cis.upenn.edu
Sat Jul 3 14:37:28 EDT 2004
I'm having trouble pickling subclasses of dict when they contain cycles.
In particular:
>>> import pickle
>>> class D(dict): pass
>>> d = D()
>>> d[1] = d # add a cycle.
>>> print d
{1: {...}}
>>> pickle.dump(d, open('d.pickle', 'w'))
Traceback (most recent call last):
File "<stdin>", line 1, in ?
File "/tmp/python-rSB6hN", line 6, in ?
pickle.dump(d, open('d.pickle', 'w'))
File "/usr/lib/python2.3/pickle.py", line 1382, in dump
Pickler(file, protocol, bin).dump(obj)
[...]
File "/usr/lib/python2.3/pickle.py", line 414, in save_reduce
save(func)
RuntimeError: maximum recursion depth exceeded
Note that pickling dict's that contain cycles works just fine, as does
pickling classes that contain cycles in their instance variables. E.g.:
>>> d = {}
>>> d[1] = d
>>> print d
>>> pickle.dump(d, open('d.pickle', 'w'))
>>> print pickle.load(open('d.pickle'))
{1: {...}}
I tried several things with __getstate__, __reduce__, etc., but couldn't
get this to work. Is there some magic that I'm missing? What's the
best way to get around this? (And should I file this as a bug in
pickle? Or am I just not seeing the right way to do it?)
-Edward
More information about the Python-list
mailing list