设置了defaultfactory的defaultdict不工作

大家好!
我有以下奇怪的问题,由于我是新手,不知何故,我想不出一个优雅的解决方案。这个问题归结为以下问题:
如何对设置了DEFAULT_FACTORY属性的集合进行PICLE处理?
例如(从空闲控制台):

选择 | 换行 | 行号
  1. >>> words = collections.defaultdict(lambda: 1)
  2. >>> f = file("temp","w")
  3. >>> pickle.dump(words,f)
  4.  
  5. Traceback (most recent call last):
  6.   File "<pyshell#77>", line 1, in <module>
  7.     pickle.dump(words,f)
  8.   File "C:\Python25\lib\pickle.py", line 1362, in dump
  9.     Pickler(file, protocol).dump(obj)
  10.   File "C:\Python25\lib\pickle.py", line 224, in dump
  11.     self.save(obj)
  12.   File "C:\Python25\lib\pickle.py", line 331, in save
  13.     self.save_reduce(obj=obj, *rv)
  14.   File "C:\Python25\lib\pickle.py", line 401, in save_reduce
  15.     save(args)
  16.   File "C:\Python25\lib\pickle.py", line 286, in save
  17.     f(self, obj) # Call unbound method with explicit self
  18.   File "C:\Python25\lib\pickle.py", line 562, in save_tuple
  19.     save(element)
  20.   File "C:\Python25\lib\pickle.py", line 286, in save
  21.     f(self, obj) # Call unbound method with explicit self
  22.   File "C:\Python25\lib\pickle.py", line 748, in save_global
  23.     (obj, module, name))
  24. PicklingError: Can't pickle <function <lambda> at 0x00C030B0>: it's not found as __main__.<lambda>
  25.  
  26. If I repeat the same with words = collections.defaultdict() everything goes fine..
  27.  
  28. In my real code I have a class that has an object property which is a defaultdict with the same default_factory set. I want to dump an object from this class with pickle and I get the following error: 
  29. Traceback (most recent call last):
  30.   File "BayesianFilter.py", line 125, in <module>
  31.     pickle.dump(bf,file(sys.argv[1]+'.bf','w'))
  32.   File "C:\Python25\lib\copy_reg.py", line 69, in _reduce_ex
  33.     raise TypeError, "can't pickle %s objects" % base.__name__
  34. TypeError: can't pickle function objects

如果我没有在defaultdict对象的构造函数中设置DEFAULT_FACTORY,则一切正常。这让我认为问题恰恰是这样的。
我知道Pickle不能转储具有函数属性的对象。但是,在转储之前,我没有找到从defaultdict对象取消设置DEFAULT_FACTORY属性的方法。在创建了defaultdict对象之后,我也没有找到再次设置它的方法。
有谁知道如何优雅地解决这个问题?
谢谢你的帮助

# 回答1


我想我知道问题是什么,但我不知道如何解决它。为什么需要对物体进行腌制?我自己从来没有发现过这个模块的用途,所以我很想知道它在您的案例中是做什么用的。可能有一种比使用Pickle模块更好的方法来保存程序中的信息。
# 回答2


基本上,我的程序需要某种类型的持久层。即存储对象并随后从文件中加载它们。我读过关于泡菜模块的文章,对我来说这似乎是一个很好的解决方案。如果有人知道做这件事的更好方法,我很想知道。
# 回答3


解决方案:

选择 | 换行 | 行号
  1. def give_me_1(): return 1
  2. words = collections.defaultdict(give_me_1)
  3.  
  4. # the rest was good
  5. f = file("temp","w")
  6. pickle.dump(words,f)

标签: python

添加新评论