目前我正在学习python tornado,我发现了一个有趣的defhere,示例代码如下
@gen.coroutine
def fetch_coroutine(url):
http_client = AsyncHTTPClient()
response = yield http_client.fetch(url)
return response.bodyere
正如您所看到的,def函数同时包含yield和return…那么,它是否遵循python规则?我们怎么能用这种定义?任何人给我一些样品都会非常感谢…
最佳答案
>>> def f():
... yield 1
... return 2
...
>>> g = f()
>>> next(g)
1
>>> next(g)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration: 2
return
在生成器中停止执行,并通过引发StopIteration
来结束迭代。显然,在return
中给出一个值只是将其作为参数传递给StopIteration
异常。注释中的pointed out表示,只有在python 3.3之后才允许传递这样的值。
该值在正常迭代(即
for x in f()
)中看不到。似乎Tornado用它做了一些特别的事情,通过使用
next
迭代并捕获异常。联程是一个复杂的话题。这可能是协同程序的“结果”,其中的yield
s将只是暂停执行和交换数据。