我刚刚阅读了PEP0492,其中谈到了协程的新方法,但该PEP未能让我理解生成器协程和本地协程之间的区别。有人可以告诉我区别吗(最好附带示例)?
据我所知,它们使用不同的单词(yield/yield from 和 await/async/yield)。我知道本地协程在结束时需要一个yield,但是对于基于生成器的协程也是如此。
我刚刚阅读了PEP0492,其中谈到了协程的新方法,但该PEP未能让我理解生成器协程和本地协程之间的区别。有人可以告诉我区别吗(最好附带示例)?
据我所知,它们使用不同的单词(yield/yield from 和 await/async/yield)。我知道本地协程在结束时需要一个yield,但是对于基于生成器的协程也是如此。
await
协程对象,则会发出警告。新语法还很好地反映了asyncio
库,并类似于其他语言使用的关键字。
无法使用的地方使用。事实上,区别正好相反:
yield from可以在
await无法使用的地方使用,即非
async`函数(这种限制有时有助于捕获错误)。 - abarnertasync
和 await
的“本地协程”只是语法糖,以前实现过的“基于生成器的协程”。如果不需要支持旧版 Python,则建议在 3.5 文档 中使用 async
和 await
关键字。传统上编写协程的方式涉及回调。尽管回调可能最初很方便,但在我看来,它们会导致高度复杂和复杂的代码,这至少不能算是Pythonic。此外,yield
(特别是自Python 3.3以来的yield from
)使实现协程变得更加容易和Pythonic。
使用生成器,您可以轻松地将代码分成初始部分和回调部分。
@asyncio.coroutine
def print_sum(x, y):
result = yield from compute(x, y)
#write callback code
print("%s + %s = %s" % (x, y, result))
func = decorator(func)
。上下文管理器是try:...except:...finally:
的语法糖。Python 一直强调可读性和目的的清晰度,这与这些目标完全契合。 - Martijn Pieters