I am trying to pickle a nested dictionary which is created using:
collections.defaultdict(lambda: collections.defaultdict(int))
My simplified code goes like this:
class A:
def funA(self):
#create a dictionary and fill with values
dictionary = collections.defaultdict(lambda: collections.defaultdict(int))
...
#then pickle to save it
pickle.dump(dictionary, f)
However it gives error:
AttributeError: Can't pickle local object 'A.funA.<locals>.<lambda>'
After I print dictionary it shows:
defaultdict(<function A.funA.<locals>.<lambda> at 0x7fd569dd07b8> {...}
I try to make the dictionary global within that function but the error is the same. I appreciate any solution or insight to this problem. Thanks!
picklerecords references to functions (module and function name), not the functions themselves. When unpickling, it will load the module and get the function by name.lambdacreates anonymous function objects that don't have names and can't be found by the loader. The solution is to switch to a named function.