在Twisted中,有一些api可以返回Deferred
。有没有快速的方法来测试返回的值是Deferred
还是实际上是返回值。
我觉得这样做看起来很草率。
stop_listening_result = self.listening_port.stopListening()
if isinstance(stop_listening_result, defer.Deferred):
stop_listening_result.addCallback(self.start)
else:
self.start()
此特定示例在IListeningPort
上调用stop
,其文档中说:
`停止听这个端口。
如果没有立即完成,将返回完成时触发的延迟。
答案 0 :(得分:7)
听起来你想要maybeDeferred
。它将在已完成的Deferred
中包含同步结果。正如文档所述:
调用可能会或可能不会返回Deferred的函数。
使用给定的参数调用给定的函数。如果退回 对象是延迟的,返回它。如果返回的对象是Failure, 将其包裹失败并返回。 否则,将其包装成功 归还。如果引发异常,请将其转换为Failure,将其换行 失败了,然后把它归还。
然后您可以随时假设已返回Deferred
:
from twisted.internet.defer import maybeDeferred
stop_listening_result = maybeDeferred(self.listening_port.stopListening)
stop_listening_result.addCallback(self.start)