不,该dill._objects
模块只是莳萝可以泡菜和不能泡菜的类型列表。再加上它只会让人dill
觉得它可以做更多事情,同时在功能上保持不变。
如果要添加pickler,请使用dill.register
(通常用作装饰器)。它需要一个功能来分解。例如,给定一个 unpicklable 类:
class A:
def __init__(self, a):
self.a = a
def __reduce__(self):
raise GoAwayError()
试图腌制一个实例A
会给你:
Traceback (most recent call last):
File "d.py", line 9, in <module>
dill.dumps(A(1))
File "/home/matthew/GitHub/dill/dill/dill.py", line 192, in dumps
dump(obj, file, protocol, byref, fmode)#, strictio)
File "/home/matthew/GitHub/dill/dill/dill.py", line 182, in dump
pik.dump(obj)
File "/usr/lib/python3.4/pickle.py", line 410, in dump
self.save(obj)
File "/usr/lib/python3.4/pickle.py", line 497, in save
rv = reduce(self.proto)
File "d.py", line 7, in __reduce__
raise GoAwayError()
NameError: name 'GoAwayError' is not defined
您可以定义一个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,)
是一个 args 元组,加载时将传递给你的重建函数。
这可能是最灵活的方法,因为您可以使用任何函数recreate_A
,包括A.__init__
如果需要,但是当您尝试腌制更复杂的类型时,您可能需要进行预处理/后处理。跳过对象的功能仍在开发中,因此如果您想这样做,则必须等待。如果你想达到同样的效果,你可以定义recreate_A
为返回 None,并且不带任何参数。