【发布时间】:2012-07-24 09:40:14
【问题描述】:
我正在使用type() 动态生成最终将被腌制的类。问题是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
这显然有效,但仅适用于从可腌制基类(具有可查找模块定义)创建的动态类:
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)
【问题讨论】:
-
避免使用pickle...它很慢,很脆弱,并且可以打开任意代码执行漏洞。相反,请使用 JSON 或 YAML 等序列化格式。
-
您能否提供您动态创建的类的示例代码?
-
@ColinDunklau 我认为如果您使用 python 的多处理模块和共享内存,那么您必须确保您共享的对象可以被腌制。 mp 模块使用酸洗来实现共享内存。
标签: python class dynamic metaprogramming pickle