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