以下代码仅仅是简单的实现,实际yield from 还需要处理其他各种异常问题
def yield_from_instance(gen):
'''
yield from 直到 gen 生成器抛出异常才继续获取调用权
'''
result = None
_iter = None #迭代器
_yield_value = None #获取子生成器 yield 产出的值 , 用于再次产出 还给调用方
_recv_value = None #调用方要send 给 gen 的值
try:
_iter = iter(gen)
_yield_value = next(_iter) #第一步激活 gen ,运行到yield , 并获取yield 产出的值
except Exception as ex: #如果一开始就有错误直接退出, 例如 gen 无法迭代
print(ex)
else:
while True: #由于yield from 直到遇到StopIteration才停止;
try:
_recv_value = yield _yield_value #把 gen 产出的值,还给调用方, 同时接受调用方send
_yield_value = _iter.send(_recv_value) #把send 过来的值 , 发送给 gen,同时把gen yield 的值在下个循环里产出;
except StopIteration as ex:
result = ex.value #获取子生成器的返回值
break #直到 gen 抛出异常意味结束
return result