Search code examples
pythonlambdapickledefaultdict

How to pickle a defaultdict which uses a lambda function?


How do I create pickle file of function (defaultDict)? The error I get is can't pickle function objects

from collections import defaultdict
dtree = lambda: defaultdict(tree)

try:    import cPickle as pickle
except: import pickle

#Create defaultdict  object:
hapPkl = dtree()

#Create Pickle file
f  = open("hapP.pkl","wb")
pickle.dump(hapPkl,f)
f.close()

StackTrace:

TypeError                                 Traceback (most recent call last)
<ipython-input-287-376cac3b4f0d> in <module>()
      1 f  = open("hapP.pkl","wb")
----> 2 pickle.dump(hapPkl,f)
      3 f.close()

/usr/lib64/python2.7/copy_reg.pyc in _reduce_ex(self, proto)
     68     else:
     69         if base is self.__class__:
---> 70             raise TypeError, "can't pickle %s objects" % base.__name__
     71         state = base(self)
     72     args = (self.__class__, base, state)

TypeError: can't pickle function objects

Solution

  • A simple workaround would be to implement your tree data-structure differently, without defaultdict:

    class DTree(dict):
        def __missing__(self, key):
            value = self[key] = type(self)()
            return value
    
    try:    import cPickle as pickle
    except: import pickle
    
    #Create dtree object:
    hapPkl = DTree()
    
    #Create Pickle file
    with open("hapP.pkl", "wb") as f:
        pickle.dump(hapPkl, f)