目前我正在学习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?任何给我一些样品的人都会非常感激......
答案 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”。