<p>不如用<code>@inlineCallbacks</code>让生活更简单(即代码更可读)。在</p>
<p>事实上,我甚至建议不要直接使用<code>Deferred</code>s,除非对于性能或在特定的用例中是绝对必要的,而是始终坚持使用<code>@inlineCallbacks</code>-这样可以使代码看起来像普通代码,同时从非阻塞行为中获益:</p>
<pre><code>from twisted.internet import reactor
from twisted.web.client import Agent
from twisted.internet.defer import inlineCallbacks
from twisted.trial import unittest
from twisted.web.http_headers import Headers
from twisted.internet.error import DNSLookupError
class SomeTestCase(unittest.TestCase):
@inlineCallbacks
def test_smth(self):
ag = Agent(reactor)
response = yield ag.request('GET', 'http://example.com/', Headers({'User-Agent': ['Twisted Web Client Example']}), None)
self.assertEquals(response.code, 200)
@inlineCallbacks
def test_exception(self):
ag = Agent(reactor)
try:
yield ag.request('GET', 'http://exampleeee.com/', Headers({'User-Agent': ['Twisted Web Client Example']}), None)
except DNSLookupError:
pass
else:
self.fail()
</code></pre>
<p>试用应该负责剩下的工作(即等待从测试函数返回的<code>Deferred</code>s(<code>@inlineCallbacks</code>-包装的可调用文件也“神奇地”返回<code>Deferred</code>-如果您还不熟悉<code>@inlineCallbacks</code>,我强烈建议您阅读更多关于<code>@inlineCallbacks</code>的内容)。在</p>
<p>另外,还有一个用于nosetests的扭曲的“插件”,它允许您从测试函数返回<code>Deferred</code>S,并让nose等待它们被激发后再退出:<a href="http://nose.readthedocs.org/en/latest/api/twistedtools.html" rel="nofollow">http://nose.readthedocs.org/en/latest/api/twistedtools.html</a></p>