d = Deferred()
d.callback(Deferred()) # Assertion error saying that a Deferred shouldn't be passed
どうしてこれなの?コードを調べてメッセージ/Tracをコミットしましたが、これが当てはまる理由はわかりません。これを回避する最も明白な方法はDeferred
、をタプルに入れることですが、そもそもなぜこの制限があるのでしょうか。
d = Deferred()
d.callback(Deferred()) # Assertion error saying that a Deferred shouldn't be passed
どうしてこれなの?コードを調べてメッセージ/Tracをコミットしましたが、これが当てはまる理由はわかりません。これを回避する最も明白な方法はDeferred
、をタプルに入れることですが、そもそもなぜこの制限があるのでしょうか。
これには2つの関連する理由があります。
まず、間違いが発生している場所の近くで、間違いの可能性が高いものを早期に発見するのに役立ちます。Deferredはコールバックされ、その結果がすべてのコールバックに渡されます。結果自体を遅延にする場合、これらのコールバックが呼び出されたときに実行できることはあまりありません。これは私を次の理由に導きます。
第2に、Deferredは、Deferredを渡すための最も一般的なユースケースを処理するチェーンをサポートします。2つのDeferred、aとbが与えられた場合、チェーンにより、bが結果を得るまでaが自身のコールバックチェーンの処理を一時停止し、その後、bの結果でコールバックチェーンを再開します。これは、DeferredのコールバックがDeferredを返すときに発生することです。で明示的に行うこともできますDeferred.chainDeferred
。