目前我正在学习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迭代并捕获异常。联程是一个复杂的话题。这可能是协同程序的“结果”,其中的yields将只是暂停执行和交换数据。

08-05 23:59
查看更多