#pep380

#1. RESULT = yield from EXPR可以简化成下面这样
#一些说明
"""
_i:子生成器,同时也是一个迭代器
_y:子生成器生产的值
_r:yield from 表达式最终的值
_s:调用方通过send()发送的值
_e:异常对象 """ _i = iter(EXPR) # EXPR是一个可迭代对象,_i其实是子生成器;
try:
_y = next(_i) # 预激子生成器,把产出的第一个值存在_y中;
except StopIteration as _e:
_r = _e.value # 如果抛出了`StopIteration`异常,那么就将异常对象的`value`属性保存到_r,这是最简单的情况的返回值;
else:
while 1: # 尝试执行这个循环,委托生成器会阻塞,这里是委托生成器在执行
_s = yield _y # 生产子生成器的值,等待调用方`send()`值,发送过来的值将保存在_s中;委托生成器yield出子生成器的值到调用方
try:
_y = _i.send(_s) # 转发_s,并且尝试向下执行;
except StopIteration as _e:
_r = _e.value # 如果子生成器抛出异常,那么就获取异常对象的`value`属性存到_r,退出循环,恢复委托生成器的运行;
break
RESULT = _r # _r就是整个yield from表达式返回的值。 """
1. 子生成器可能只是一个迭代器,并不是一个作为协程的生成器,所以它不支持.throw()和.close()方法;
2. 如果子生成器支持.throw()和.close()方法,但是在子生成器内部,这两个方法都会抛出异常;
3. 调用方让子生成器自己抛出异常
4. 当调用方使用next()或者.send(None)时,都要在子生成器上调用next()函数,当调用方使用.send()发送非 None 值时,才调用子生成器的.send()方法;
"""
_i = iter(EXPR)
try:
_y = next(_i)
except StopIteration as _e:
_r = _e.value
else:
while 1:
try:
_s = yield _y
except GeneratorExit as _e:
try:
_m = _i.close
except AttributeError:
pass
else:
_m()
raise _e
except BaseException as _e:
_x = sys.exc_info()
try:
_m = _i.throw
except AttributeError:
raise _e
else:
try:
_y = _m(*_x)
except StopIteration as _e:
_r = _e.value
break
else:
try:
if _s is None:
_y = next(_i)
else:
_y = _i.send(_s)
except StopIteration as _e:
_r = _e.value
break
RESULT = _r """
看完代码,我们总结一下关键点: 1. 子生成器生产的值,都是直接传给调用方的;调用方通过.send()发送的值都是直接传递给子生成器的;如果发送的是 None,会调用子生成器的__next__()方法,如果不是 None,会调用子生成器的.send()方法;
2. 子生成器退出的时候,最后的return EXPR,会触发一个StopIteration(EXPR)异常;
3. yield from表达式的值,是子生成器终止时,传递给StopIteration异常的第一个参数;
4. 如果调用的时候出现StopIteration异常,委托生成器会恢复运行,同时其他的异常会向上 "冒泡";
5. 传入委托生成器的异常里,除了GeneratorExit之外,其他的所有异常全部传递给子生成器的.throw()方法;如果调用.throw()的时候出现了StopIteration异常,那么就恢复委托生成器的运行,其他的异常全部向上 "冒泡";
6. 如果在委托生成器上调用.close()或传入GeneratorExit异常,会调用子生成器的.close()方法,没有的话就不调用。如果在调用.close()的时候抛出了异常,那么就向上 "冒泡",否则的话委托生成器会抛出GeneratorExit异常。 """

最新文章

  1. 三张图片详解Asp.Net 全生命周期
  2. [转]backbone.js 初探
  3. 在weblogic11g上发布项目遇到的一个错误(不支持web-app_3_0)
  4. DOM生成XML文档与解析XML文档(JUNIT测试)
  5. (一)问候Spring4
  6. SEOer怎样安排一天的工作
  7. WIN7 数据源配置问题(32位&&64位)
  8. Android Studio环境下代码混淆+签名打包
  9. macbook配置xdebug+vscode
  10. geotrellis使用(四十二)将 Shp 文件转为 GeoJson
  11. C#情怀与未来
  12. Python3 系列之 编程规范篇
  13. dp进阶——饥饿的奶牛
  14. Django 中如何让外部访问本地的静态资源
  15. API接口重复提交
  16. VB6 获取和设置默认打印机
  17. [转]JSP中EL表达式三元运算符的使用
  18. java.io.InvalidClassException
  19. 2018.07.03 POJ 3348 Cows(凸包)
  20. mysql 数据到 导入导出 总结

热门文章

  1. selectpage选择订单的时候,订单数量和金额会动态改变
  2. redis安装等其他操作
  3. Windows 10 powershell 中文乱码解决方案
  4. python3的reload(sys)
  5. RPM包安装——yum安装
  6. 采坑 - LODOP,打印预览
  7. Android框架Volley之:ImageRequest请求实现图片加载
  8. Vue实战狗尾草博客后台管理系统第七章
  9. ms sql事务输出错误
  10. 往对象数组里面添加相同的key 不同的value 和删除相同的key值