检查twisted返回值是否为Deferred

2 投票
1 回答
1071 浏览
提问于 2025-04-18 08:37

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)

撰写回答