2014-12-08 49 views
1

我想序列化一些代碼,我沒有寫,不能修改,需要醃製/蒔蘿。該腳本包含一個mongodb集合對象---它實際上並沒有在以後使用,但是它正在拋出一個錯誤。當我嘗試迪林,我收到錯誤:如何添加自定義類型到蒔蘿的pickleable類型

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)和我懷疑這是我可能會改變一些東西,讓一種新型。

但是,我不清楚添加自定義類型的目的接口是什麼。 (或者也許除了這個之外,所有的酸洗都可以或更容易?)

回答

3

不,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,並且不帶任何參數。

+1

如果你想fork'dill'將你的特定類型添加到'dill'中......然後做@matsjoyce說的,但是你可以編輯文件'dill.dill.py'來直接添加你的類型爲反對「註冊」它。如果你看看'dill.dill',它基本上是這些'註冊'功能的集合。 我不會預見'dill'負責明確管理這些奇特的第三方類型 - 但是如果您發現導致問題的非常常見的基礎類型,那麼這更有可能獲得成功的PR。 – 2014-12-09 03:25:48

+0

Mike McKerns,如果我想添加一個新類型但是無法直接編輯我的環境中的蒔蘿源代碼,您有建議嗎?這是一個monkeypatch的情況? – Mittenchops 2014-12-24 10:03:12

+0

做我在回答中所說的話嗎?你不需要爲此編輯蒔蘿。 – matsjoyce 2014-12-24 13:31:44

相關問題