如何pickle一个使用lambda函数的defaultdict?

2024-09-28 20:55:12 发布

您现在位置:Python中文网/ 问答频道 /正文

如何创建函数的pickle文件(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()

堆栈跟踪:

^{pr2}$

Tags: 文件lambda函数fromimportobjects错误create
2条回答

cPickle错误消息有点误导;pickle版本更好。并不是说您不能pickle函数;而是它们需要通过它们的__name__可用。lambda已将__name__设置为'<lambda>',因此它不可拾取。用def定义它:

def tree():
    return defaultdict(tree)

而且是可以挑选的。(当您取消拾取时,仍然需要一个匹配的tree定义。)

一个简单的解决方法是以不同的方式实现树数据结构,而不使用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
f = open("hapP.pkl", "wb")
pickle.dump(hapPkl, f)
f.close()

相关问题 更多 >