让我们来看一看close/throw调用一个yield from生成器的情况。
close一个yield from生成器,yield from生成器及其子生成器都close掉了,并且下游的子生成器先close,上游的yield from生成器后close。这是显然的,如果上游的yield from生成器先close了,它就没法再去close子生成器了,因为这不是一个异步的过程。
import inspect
def producer():
yield 1
def messenger():
yield from producer()
def consumer():
m = messenger()
next(m)
p = m.gi_yieldfrom
m.close()
return m, p
m, p = consumer()
print(inspect.getgeneratorstate(m))
print(inspect.getgeneratorstate(p))
throw一个非GeneratoExit异常给yield from生成器,yield from生成器会把异常throw给它的子生成器,子生成器未捕获异常,子生成器会异常终止,异常再抛到上游的yield from生成器,yield from未捕获异常也会终止。throw一个GeneratorExit异常的情况稍有不同,yield from生成器会close子生成器然后自己再raise GeneratorExit异常终止自己。
import inspect, traceback
def producer():
yield 1
def messenger():
yield from producer()
def consu