【问题标题】:How to pickle a defaultdict which uses a lambda function?如何腌制使用 lambda 函数的 defaultdict?
【发布时间】:2016-06-20 18:32:01
【问题描述】:

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

堆栈跟踪:

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

【问题讨论】:

  • tree 来自哪里?你只定义dtree
  • 在 Python 3 中,酸洗函数在使用 def 语句定义时有效,但在使用 lambda 定义时无效(即使 lambda 分配给多变的)。试试def dtree(): return defaultdict(dtree) 可能吗?
  • @Blckknght 使用 Python 2。
  • @user2357112,奇怪,不会抛出错误
  • 我在写上面的评论时没有检查,但在 Python 2 中的行为是相同的(只是错误消息不太清楚)。

标签: python lambda pickle defaultdict


【解决方案1】:

cPickle 错误信息有点误导; pickle 版本更好。不是你不能腌制功能;这是他们需要通过__name__ 提供服务。 lambda 将__name__ 设置为'&lt;lambda&gt;',因此它不可腌制。用def定义它:

def tree():
    return defaultdict(tree)

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

【讨论】:

  • @user,你是什么意思:匹配定义?
  • @Merlin:如果您尝试在没有定义tree 的环境中解开此默认字典,它将无法正常工作。
  • @user2357112,什么不起作用.. unpickling,或者 defaultdicts 的嵌套。
【解决方案2】:

一个简单的解决方法是在没有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()

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多