2

これが私の試みです:

deferred.defer(class1().method1, class2.method2, arg)
deferred.defer(class1().method1, class2.method2(), arg)

これらは両方ともエラーで失敗します:

Can't pickle <type 'instancemethod'>: it's not found as __builtin__.instancemethod

インスタンスメソッドをピクルスにする方法に関する別の投稿で、Steven Bethardのソリューションが提案されました:http://bytes.com/topic/python/answers/552476-why-cant-you-pickle-instancemethods(ページの下部に向かって)

コードのフォーマットが失われ、延期された問題を解決するためにコードを正常に使用できませんでした。

4

1 に答える 1

5

使用する関数はdeferred.defer、この直接インポート可能なグローバル関数である必要があります。これは、Deferredハンドラーがほぼ確実に別のインタープリターインスタンスで機能するため、問題の関数をインポートする必要があるためです。

コードで実際のクラス名を参照している場合class1、問題に取り組む最も簡単な方法は、そのメソッドへの呼び出しをグローバル関数内でラップし、それを次のように渡すことdeferです。

def deferred_method_call(*args, **kwargs):
    class1.method1(*args, **kwargs)

deferred.defer(deferred_method_call, ...)

一方、class1が実際のクラスを指す変数の名前である場合は、それをパラメーターとして関数に渡します。

def deferred_method_call(class_, *args, **kwargs):
    class_.method1(*args, **kwargs)

deferred.defer(deferred_method_call, class1, ...)

これが機能するのは、クラスオブジェクト(のインスタンス)が選択可能であり、 ed関数typeに引数として渡すことができるためです。defer

于 2012-06-28T13:32:41.280 に答える