不,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
你可以這樣定義一個皮克勒:
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,並且不帶任何參數。
如果你想fork'dill'將你的特定類型添加到'dill'中......然後做@matsjoyce說的,但是你可以編輯文件'dill.dill.py'來直接添加你的類型爲反對「註冊」它。如果你看看'dill.dill',它基本上是這些'註冊'功能的集合。 我不會預見'dill'負責明確管理這些奇特的第三方類型 - 但是如果您發現導致問題的非常常見的基礎類型,那麼這更有可能獲得成功的PR。 – 2014-12-09 03:25:48
Mike McKerns,如果我想添加一個新類型但是無法直接編輯我的環境中的蒔蘿源代碼,您有建議嗎?這是一個monkeypatch的情況? – Mittenchops 2014-12-24 10:03:12
做我在回答中所說的話嗎?你不需要爲此編輯蒔蘿。 – matsjoyce 2014-12-24 13:31:44