如何将自定义类型添加到dill的可选择类型

2024-04-19 18:20:19 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试序列化一些我没有写,也无法修改的代码,这些代码需要进行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行),我怀疑这是我可以更改某些内容以允许新类型的地方。在

但是,我不清楚添加自定义类型的预期接口是什么。(或者可能是为了除此之外的所有东西进行酸洗,这是可能的还是更容易的?)在


Tags: 对象代码脚本类型序列化objectismongodb
1条回答
网友
1楼 · 发布于 2024-04-19 18:20:19

不,dill._objects模块只是dill可以和不能pickle类型的列表。加上这些只会让dill认为它可以做得更多,同时在功能上保持不变。在

如果要添加pickler,请使用dill.register(通常用作装饰器)。它需要一个函数来完成分解。E、 g.给定一个不可拾取的类:

class A:
    def __init__(self, a):
        self.a = a
    def __reduce__(self):
        raise GoAwayError()

尝试pickle一个A的实例将给您提供:

^{pr2}$

可以将pickler定义为:

def recreate_A(a):
    return A(a)

@dill.register(A)
def save_A(pickler, obj):
    pickler.save_reduce(recreate_A, (obj.a,), obj=obj)

recreate_A是用于重建的函数,(obj.a,)是一个参数元组,加载时将传递给重建函数。在

这可能是最灵活的方法,因为如果需要,您可以为recreate_A使用任何函数,包括A.__init__,但是当您试图提取一个更复杂的类型时,可能需要进行前/后处理。跳过对象的功能是still in the works,因此如果要这样做,则必须等待。如果你想达到同样的效果,你可以定义recreate_A来返回None,而不接受任何参数。在

相关问题 更多 >