2012-04-10 10 views
1

この質問へのフォローアップとして: How to pickle a python function with its dependencies?Python関数のpicklingの依存関係を取得するには?

方法の依存関係を決定するための良い方法は何ですか?例えば、上記のポストと同様に、メソッドgとyを使用する関数fがある場合、gとyへの参照を動的に取得する簡単な方法はありますか?

さらに、このメソッドが関数グラフ全体を再帰して、yがzに依存する場合はzも束ねることができると思います。

私はディスコが、このために、以下のモジュールを使用していることを参照してください。 https://github.com/discoproject/disco/blob/master/lib/disco/worker/classic/modutil.py

これに対処する方法上の任意の他の提案?ディスコのアプローチはモジュールベースなので、実際にルートメソッドを実行するのに必要以上にバンドルする必要があります。

答えて

1

これを行うには、dillを使用します。これは、Pythonのほとんどすべてをシリアル化できます。 Dillには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) 
>>> ... 

あなたは絶対に、あなたの代わりに、すべてでそれを呼び出すのでは、あなたのオブジェクトの参照チェーンに再帰的に飛び込むと、unpickleableオブジェクトを飛び出すためにディルのbadobjects(または他の検出機能の1)を使用することができますしたい場合深さは、上記のように。

また、objgraphは、テストスイートにも非常に便利です。

>>> # visualize the references in your bad objects 
>>> objgraph.show_refs(your_bad_object, filename='your_bad_object.png') 

上記の記事で述べたように、1つのコマンドでpythonセッション全体をピクルするには、dillを使用できます。それはここであなたの質問のために少し残酷ですが、それはあまりにもうまくいくでしょう。

関連する問題