在Python中,大多数收益率的例子都说明了这一点
yield from foo()
类似于
for x in foo(): yield x
另一方面,它并没有引发一些魔法 . 我觉得使用一个我不懂的魔法的函数有点不安 . 我怎么知道 yield from 的魔力,以避免陷入魔法做我不期望的事情?我应该注意到魔法提供了哪些优势?
yield from
当 foo() 返回常规可迭代时,两者是等价的 . 'magic'在 foo() 也是发电机时起作用 . 那一刻, yield from foo() 和 for x in foo(): yield x 案件有很大不同 .
foo()
也可以使用generator.send() method发送数据 . 当您使用 for 循环时, yield x 表达式'receives'发送的数据; foo() 发电机永远不会看到这个 . 但是当你使用 yield from 时,发送的数据直接转到委托生成器当前暂停的任何 yield 表达式 . 换句话说, yield from 传递已发送的数据,因此委托生成器可以接收它 .
for
yield x
yield
您还可以使用generator.throw()在生成器中引发异常;在 for 循环的情况下,异常从 yield x 行引发,而 yield from 异常再次传递;异常是在 foo() 内引发的 .
总之,这意味着 yield from 本质上在委托迭代的持续时间内替换当前生成器 .
委托生成器也可以与父生成器通信,完成后 StopIteration 异常的 .value 属性将作为 yield from 表达式的值返回 . 您可以在委派给 foo() 生成器中使用 return <expression> 来设置该异常的值,也可以显式使用 raise StopIteration(<expression>) .
StopIteration
.value
return <expression>
raise StopIteration(<expression>)
yield from 被PEP 380: Syntax for Delegating to a Subgenerator引入语言 .
1 回答
当
foo()
返回常规可迭代时,两者是等价的 . 'magic'在foo()
也是发电机时起作用 . 那一刻,yield from foo()
和for x in foo(): yield x
案件有很大不同 .也可以使用generator.send() method发送数据 . 当您使用
for
循环时,yield x
表达式'receives'发送的数据;foo()
发电机永远不会看到这个 . 但是当你使用yield from
时,发送的数据直接转到委托生成器当前暂停的任何yield
表达式 . 换句话说,yield from
传递已发送的数据,因此委托生成器可以接收它 .您还可以使用generator.throw()在生成器中引发异常;在
for
循环的情况下,异常从yield x
行引发,而yield from
异常再次传递;异常是在foo()
内引发的 .总之,这意味着
yield from
本质上在委托迭代的持续时间内替换当前生成器 .委托生成器也可以与父生成器通信,完成后
StopIteration
异常的.value
属性将作为yield from
表达式的值返回 . 您可以在委派给foo()
生成器中使用return <expression>
来设置该异常的值,也可以显式使用raise StopIteration(<expression>)
.yield from
被PEP 380: Syntax for Delegating to a Subgenerator引入语言 .