2012-04-10 85 views
1

作爲這個問題的後續: How to pickle a python function with its dependencies?如何獲得一個python函數的酸洗依賴關係?

什麼是確定方法的依賴關係的好方法?例如,類似於上面的帖子,如果我有一個使用方法g和y的函數f,是否有一種簡單的方法來動態地獲取對g和y的引用?

此外,我想你會希望這種方法遞減整個函數圖,如果y依賴於z,你也可以捆綁z。

我看到了迪斯科使用此以下模塊: https://github.com/discoproject/disco/blob/master/lib/disco/worker/classic/modutil.py

如何解決這個任何其他建議?迪斯科的方法似乎是基於模塊的,所以你可能不得不捆綁比實際執行根方法更多的東西。

回答

1

要做到這一點,我會使用dill,它可以序列化幾乎任何東西在Python中。蒔蘿還有some good tools幫助您瞭解什麼導致您的酸洗在代碼失敗時失敗。

>>> import dill 
>>> dill.loads(dill.dumps(your_bad_object)) 
>>> ... 
>>> # if you get a pickling error, use dill's tools to figure out a workaround 
>>> dill.detect.badobjects(your_bad_object, depth=0) 
>>> dill.detect.badobjects(your_bad_object, depth=1) 
>>> ... 

如果你絕對想,你可以使用蒔蘿的badobjects(或其他檢測功能之一)遞歸地潛入你的對象的引用鏈,並蹦出unpickleable對象,與其說這是在每深度,如上所述。

此外,objgraph也是測試套件的一個非常方便的讚美。或者,正如我在上面提到的文章中提到的那樣,您可以使用dill在一個命令中醃製整個python會話。這對你的問題有點矯枉過正,但它也能工作。