为什么不能将延迟传递给Python Twisted中的回调?

Oli*_*eng 2 python twisted deferred-execution

d = Deferred()
d.callback(Deferred()) # Assertion error saying that a Deferred shouldn't be passed
Run Code Online (Sandbox Code Playgroud)

为什么是这样?我查看了代码并提交了messages/Trac,并且没有理由说明为什么会出现这种情况.绕过这个最明显的方法就是把它Deferred放在一个元组中,但为什么这个限制在这里呢?

Jea*_*one 5

这有两个相关的原因.

首先,它有助于尽早发现可能出现的错误 - 在错误发生的地方附近.使用结果调用Deferred,然后将结果传递给其所有回调.如果你将结果本身设为Deferred,那么这些回调在被调用时可以做的并不多.这引出了我的下一个原因.

其次,Deferreds支持是链接,它处理一个传递延迟的最常见用例.给定两个延迟,a和b,链接导致a暂停处理其自己的回调链,直到b有结果,然后恢复其回调链,结果为b.当Deferred上的回调返回Deferred时会发生这种情况.它也可以明确地用Deferred.chainDeferred.