chapter16 协程

2017-12-01  本文已影响0人  F4A3

从语法上看,协程与生成器类似。但是协程中,yield通常出现在表达式的右边(例如, datum = yield)。协程可以从调用方接受数据,如.send(datum)方法。要理解协程,需要从根本上把yield视作控制流程的方式。

生成器如何进化为协程

用作协程的生成器的基本行为

协程可以处于四个状态中的一个,当前状态可以使用inspect.getgeneratorstat(...)函数确定

预激协程的装饰器

如果不预激(使用next首次启动协程,到达yield处停止),协程没什么用.我们可以使用一个预激装饰器

from functools import wraps
def coroutine(func):
    @wraps(func)
    def primer(*args,**kwargs):
    gen = func(*args, **kwargs)
    next(gen)
    return gen
return primer

终止协程和异常处理

协程中未出率的异常会向上抛出,传给next函数或者send方法的调用方(即触发协程的对象)。

让协程返回值

协程的返回值return表达式的值会偷偷的传给调用方,赋值给StopIteration异常的一个属性。获取该属性可以从异常的value中拿到。
其实,yield from 结构跟for循环处理StopIteration异常的方式一样。解释器不仅会捕获StopIteration异常,还会把value属性的值变为yield from表达式的值。

如何使用yield from

上一篇 下一篇

猜你喜欢

热点阅读