如何腌制使用 lambda 函数的 defaultdict?

Mer*_*lin 0 python lambda pickle defaultdict

如何创建函数 ( defaultDict) 的泡菜文件?我得到的错误是不能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()
Run Code Online (Sandbox Code Playgroud)

堆栈跟踪:

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()
Run Code Online (Sandbox Code Playgroud)

use*_*ica 5

该cPickle错误消息是有点误导; 该pickle版本更好。并不是你不能pickle函数;这是他们需要由他们的__name__. lambda 已__name__设置为'<lambda>',因此它不可pickle。定义它def:

def tree():
    return defaultdict(tree)
Run Code Online (Sandbox Code Playgroud)

它是可腌制的。(tree当你解开它时,你仍然需要一个可用的匹配定义。)