是否有可能python def包含" yield"并且"返回"?

时间:2014-11-23 13:08:03

标签: python tornado

目前我正在学习python龙卷风,我发现了一个有趣的def here,示例代码为

@gen.coroutine
def fetch_coroutine(url):
    http_client = AsyncHTTPClient()
    response = yield http_client.fetch(url)
    return response.bodyere

如您所见,def函数包含yield和return ...那么,它是否遵循python规则?我们怎样才能使用这种def?任何给我一些样品的人都会非常感激......

2 个答案:

答案 0 :(得分:3)

>>> 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只是暂停执行和交换数据。

答案 1 :(得分:2)

不在Python 2中。在Python 2中,包含“yield”的函数可以具有没有值的“返回”,但不允许返回值。龙卷风有一个解决方案:你可以屈服然后提高gen.Return(值):

@gen.coroutine
def fetch_coroutine(url):
    http_client = AsyncHTTPClient()
    response = yield http_client.fetch(url)
    raise gen.Return(response.body)

在Python 3.3及更高版本中,包含“yield”的函数也可以返回一个值:

@gen.coroutine
def fetch_coroutine(url):
    http_client = AsyncHTTPClient()
    response = yield http_client.fetch(url)
    return response.body

Python 3.3获得了从PEP 380中的生成器返回值的能力,以及新语句“yield from”。