我正在尝试序列化一些我没有写,也无法修改的代码,这些代码需要进行pickle/dill处理。这个脚本包含一个mongodb集合对象——它在后面并没有实际使用,但是dilling它会抛出一个错误。当我试着学习时,我收到了一个错误:
Collection object is not callable. If you meant to call __getnewargs__ method on a 'Database' object it is failing because no such method exists.
我在这里看到了枚举可接受类型的代码: https://github.com/uqfoundation/dill/blob/master/dill/_objects.py(第132-190行),我怀疑这是我可以更改某些内容以允许新类型的地方。在
但是,我不清楚添加自定义类型的预期接口是什么。(或者可能是为了除此之外的所有东西进行酸洗,这是可能的还是更容易的?)在
不,
dill._objects
模块只是dill可以和不能pickle类型的列表。加上这些只会让dill
认为它可以做得更多,同时在功能上保持不变。在如果要添加pickler,请使用
dill.register
(通常用作装饰器)。它需要一个函数来完成分解。E、 g.给定一个不可拾取的类:尝试pickle一个
^{pr2}$A
的实例将给您提供:可以将pickler定义为:
recreate_A
是用于重建的函数,(obj.a,)
是一个参数元组,加载时将传递给重建函数。在这可能是最灵活的方法,因为如果需要,您可以为
recreate_A
使用任何函数,包括A.__init__
,但是当您试图提取一个更复杂的类型时,可能需要进行前/后处理。跳过对象的功能是still in the works,因此如果要这样做,则必须等待。如果你想达到同样的效果,你可以定义recreate_A
来返回None,而不接受任何参数。在相关问题 更多 >
编程相关推荐