gpt4 book ai didi

python - pickle 动态生成的类?

转载 作者:IT老高 更新时间:2023-10-28 22:12:41 33 4
gpt4 key购买 nike

我正在使用 type() 动态生成最终将被 pickle 的类。问题是un-pickling过程需要类的定义才能重新构造已经被pickle过的对象。

这就是我卡住的地方。我不知道如何以某种方式提供 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

这显然有效,但仅适用于从可 pickle 基类(具有可查找模块定义)创建的动态类:

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)

最佳答案

当 Pickler 遇到一个它不知道的类型的对象时,它会寻找 reduce method .在使用 type 构建自定义类时定义此方法应该可以解决 pickle 问题。

如果您提供初始参数,那么您可能还需要定义一个 getnewargs method

关于python - pickle 动态生成的类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11658511/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com