1

この質問のフォローアップとして: How to pickle a python function with its dependencies?

メソッドの依存関係を判断するための適切なアプローチは何ですか? たとえば、上記の投稿と同様に、メソッド g と y を使用する関数 f がある場合、g と y への参照を動的に取得する簡単な方法はありますか?

さらに、y が z に依存している場合は z もバンドルできるように、このメソッドで関数グラフ全体を再帰的に処理する必要があると思います。

これには、ディスコが次のモジュールを使用していることがわかります: https://github.com/discoproject/disco/blob/master/lib/disco/worker/classic/modutil.py

これに取り組む方法に関する他の提案はありますか?disco のアプローチはモジュール ベースのように見えるため、ルート メソッドを実際に実行するために必要以上のものをバンドルする必要がある可能性があります。

4

1 に答える 1

1

これを行うには、 Python でほとんど何でもシリアル化できるdillを使用します。Dill には、コードが失敗したときに pickle 化が失敗する原因を理解するのに役立ついくつかの優れたツールもあります。

>>> 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(または他の検出関数の 1 つ) を使用して、オブジェクトの参照チェーンに再帰的に飛び込み、上記のようにすべての深さで呼び出す代わりに、ピクルできないオブジェクトをポップアウトすることができます。

また、objgraphは、テスト スイートに対する非常に便利な補完物でもあります。

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

または、上記の投稿で述べたように、dill を使用して 1 つのコマンドで Python セッション全体をピクルできます。ここでの質問には少しやり過ぎですが、うまくいきます。

于 2013-10-16T21:21:18.620 に答える