我type()
用来动态生成最终将被腌制的类。问题是取消腌制过程需要类的定义才能重新构造已腌制的对象。
这就是我卡住的地方。我不知道如何以某种方式为unpickler 提供一种从动态生成的类生成实例的方法。
任何提示表示赞赏。
谢谢!
这是问题的一个例子:
>>> class Foo(object):
... pass
>>> g=type('Goo',(Foo,),{'run':lambda self,x: 2*x } )()
>>> cPickle.dumps(g)
PicklingError: Can't pickle <class '__main__.Goo'>: attribute lookup __main__.Goo failed
这显然有效,但仅适用于从可腌制基类(具有可查找模块定义)创建的动态类:
import cPickle
class Foo(object): pass
def dynamic(): return type('Goo',(Foo,),{'run':lambda self,x: 2*x } )()
g=type('Goo',(Foo,),{'run':lambda self,x: 2*x , '__reduce__': lambda self: (dynamic,tuple()) } )()
gg=cPickle.loads ( cPickle.dumps(g) )
print gg.run(10)