zoukankan      html  css  js  c++  java
  • coroutine

     1 yield from
     2     yield from x 表达式对 x 对象所做的第一件事是,调用 iter(x),从中获取迭代器。因
     3     此, x 可以是任何可迭代的对象。
     4     可是,如果 yield from 结构唯一的作用是替代产出值的嵌套 for 循环,这个结构很有
     5     可能不会添加到 Python 语言中。 yield from 结构的本质作用无法通过简单的可迭代对象
     6     说明,而要发散思维,使用嵌套的生成器。因此,引入 yield from 结构的 PEP 380 才起
     7     了“Syntax for Delegating to a Subgenerator”(“把职责委托给子生成器的句法”)这个标题。
     8     yield from 的主要功能是打开双向通道,把最外层的调用方与最内层的子生成器连接起
     9     来,这样二者可以直接发送和产出值,还可以直接传入异常,而不用在位于中间的协程中
    10     添加大量处理异常的样板代码。有了这个结构,协程可以通过以前不可能的方式委托职责。
    11     若想使用 yield from 结构,就要大幅改动代码。为了说明需要改动的部分, PEP 380 使
    12     用了一些专门的术语。
    13     
    14     委派生成器
    15       包含 yield from <iterable> 表达式的生成器函数。
    16     
    17     子生成器
    18       从 yield from 表达式中 <iterable> 部分获取的生成器。这就是 PEP 380 的标题
    19        (“Syntax for Delegating to a Subgenerator”)中所说的“子生成器”(subgenerator)。
    20    
    21     调用方
    22         PEP 380 使用“调用方”这个术语指代调用委派生成器的客户端代码。
    23     
    24     子生成器可能是简单的迭代器,只实现了 __next__ 方法;但是, yield from 也能处理这种子生成器。
    25     不过,引入 yield from 结构的目的是为了支持实现了 __next__、 send、 close 和throw 方法的生成器。
    26     
    27     如果子生成器不终止,委派生成器会在 yield from 表达式处永远暂停。如果是这样,程序不会向前执行,
    28     因为 yield from(与 yield 一样)把控制权转交给客户代码(即,委派生成器的调用方)了。显然,
    29     肯定有任务无法完成.
    30     
    31     因为委派生成器相当于管道,所以可以把任意数量个委派生成器连接在一起:一个委派生成器使用 
    32     yield from 调用一个子生成器,而那个子生成器本身也是委派生成器,使用 yield from 
    33     调用另一个子生成器,以此类推。最终,这个链条要以一个只使用 yield 表达式的简单生成器结束;
    34     不过,也能以任何可迭代的对象结束.
    35     
    36     任何 yield from 链条都必须由客户驱动,在最外层委派生成器上调用 next(...) 函数
    37     或 .send(...) 方法。可以隐式调用,例如使用 for 循环。
    38     
    39 批准后的 PEP 380 在“Proposal”一节(https://www.python.org/dev/peps/pep-0380/#proposal)
    40 分六点说明了 yield from 的行为。
    41     a, 子生成器产出的值都直接传给委派生成器的调用方(即客户端代码)。
    42     b, 使用 send() 方法发给委派生成器的值都直接传给子生成器。如果发送的值是
    43        None,那么会调用子生成器的 __next__() 方法。如果发送的值不是 None,那么会
    44        调用子生成器的 send() 方法。如果调用的方法抛出 StopIteration 异常,那么委
    45        派生成器恢复运行。任何其他异常都会向上冒泡,传给委派生成器。
    46     c, 生成器退出时,生成器(或子生成器)中的 return expr 表达式会触发
    47        StopIteration(expr) 异常抛出。
    48     d, yield from 表达式的值是子生成器终止时传给 StopIteration 异常的第一个参数。
    49     e, yield from 结构的另外两个特性与异常和终止有关。传入委派生成器的异常,
    50        除了 GeneratorExit 之外都传给子生成器的 throw() 方法。如果调用 throw() 
    51        方法时抛出 StopIteration 异常,委派生成器恢复运行。 StopIteration 之外的
    52        异常会向上冒泡,传给委派生成器。     
    53     f, 如果把 GeneratorExit 异常传入委派生成器,或者在委派生成器上调用 close() 方
    54        法,那么在子生成器上调用 close() 方法,如果它有的话。如果调用 close() 方法
    55        导致异常抛出,那么异常会向上冒泡,传给委派生成器;否则,委派生成器抛出 GeneratorExit 异常。 
  • 相关阅读:
    Castle 开发系列文章
    ASP.NET MVC 3 Release Candidate 发布喽
    Scott Hanselman on SpeakerWiki
    2010年上半年计算机软考软件设计师试卷参考答案
    一站式示例代码库2010年11月5日更新
    从数据到代码—基于T4的代码生成方式
    CodeDOM
    老吉优秀的数据库访问层代码(转)
    非关语言: 设计模式
    EntLib
  • 原文地址:https://www.cnblogs.com/zzyzz/p/7881783.html
Copyright © 2011-2022 走看看