Search code examples
pythonpickledefaultdict

Can't pickle defaultdict


I have a defaultdict that looks like this:

dict1 = defaultdict(lambda: defaultdict(int))

The problem is, I can't pickle it using cPickle. One of the solution that I found here is to use module-level function instead of a lambda. My question is, what is module-level function? How can I use the dictionary with cPickle?


Solution

  • In addition to Martijn's explanation:

    A module-level function is a function which is defined at module level, that means it is not an instance method of a class, it's not nested within another function, and it is a "real" function with a name, not a lambda function.

    So, to pickle your defaultdict, create it with module-level function instead of a lambda function:

    def dd():
        return defaultdict(int)
    
    dict1 = defaultdict(dd) # dd is a module-level function
    

    than you can pickle it

    tmp = pickle.dumps(dict1) # no exception
    new = pickle.loads(tmp)