Я использую 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)