检查twisted返回值是否为Deferred
在Twisted这个框架中,有一些接口可以返回一个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
方法,按照他们的文档说明:
如果没有立即完成,将返回一个在完成时会触发的Deferred对象。
1 个回答
8
听起来你想要使用 maybeDeferred
。这个功能可以把一个同步的结果放到一个已经完成的 Deferred
里。就像文档里说的:
调用一个可能会返回
Deferred
的函数。用给定的参数调用这个函数。如果返回的结果是一个
Deferred
,那就直接返回它。如果返回的是一个失败的结果,就用 fail 包裹它并返回。否则,就用 succeed 包裹它并返回。如果出现了异常,就把它转成一个失败的结果,用 fail 包裹后再返回。
这样你就可以始终假设返回的是一个 Deferred
了:
from twisted.internet.defer import maybeDeferred
stop_listening_result = maybeDeferred(self.listening_port.stopListening)
stop_listening_result.addCallback(self.start)