在Twisted中有一些可以返回的api Deferred.是否有一种快速方法可以测试返回值是否为a Deferred或实际上是返回值.
我觉得这样做看起来很草率.
stop_listening_result = self.listening_port.stopListening()
if isinstance(stop_listening_result, defer.Deferred):
stop_listening_result.addCallback(self.start)
else:
self.start()
Run Code Online (Sandbox Code Playgroud)
这个特殊的例子是调用stopa IListeningPort,从他们的文档中说:`停止监听这个端口.
如果没有立即完成,将返回完成时触发的延迟.
这听起来像你想要的maybeDeferred.它将在已完成的事件中包含同步结果Deferred.正如文件所述:
调用可能会或可能不会返回Deferred的函数.
使用给定的参数调用给定的函数.如果返回的对象是Deferred,则返回它.如果返回的对象是Failure,请将其包装失败并返回.否则,将其包装成功并返回.如果引发异常,请将其转换为Failure,将其包装为fail,然后返回它.
然后你可以随时假设Deferred已经返回:
from twisted.internet.defer import maybeDeferred
stop_listening_result = maybeDeferred(self.listening_port.stopListening)
stop_listening_result.addCallback(self.start)
Run Code Online (Sandbox Code Playgroud)