在 Python 中,yield from 的大多数示例都是这样解释的
yield from foo()
类似于
for x in foo(): yield x
另一方面,它似乎并不完全相同,并且有一些魔法。我对使用一个我不理解的魔法函数感到有点不安。yield from
为了避免陷入魔术会做我没想到的事情的情况,我必须了解什么?魔法提供了哪些我应该注意的优势?
在 Python 中,yield from 的大多数示例都是这样解释的
yield from foo()
类似于
for x in foo(): yield x
另一方面,它似乎并不完全相同,并且有一些魔法。我对使用一个我不理解的魔法函数感到有点不安。yield from
为了避免陷入魔术会做我没想到的事情的情况,我必须了解什么?魔法提供了哪些我应该注意的优势?
当foo()
返回一个常规迭代时,两者是等价的。当发电机也是如此时,“魔法”就会发挥foo()
作用。在那一刻,和案件有很大不同。yield from foo()
for x in foo(): yield x
生成器也可以使用方法发送数据。当您使用循环时,表达式“接收”发送的数据;生成器永远不会看到这一点。但是,当您使用发送的数据时,会直接转到委托生成器当前暂停的任何表达式。换句话说,传递发送的数据,以便委托生成器可以接收它。generator.send()
for
yield x
foo()
yield from
yield
yield from
您还可以在生成器中引发异常,使用generator.throw()
; 在for
循环情况下,从yield x
行中引发异常,而yield from
在异常情况下再次传递;而是在内部引发异常foo()
。
总之,这意味着yield from
在委托迭代期间实质上替换了当前生成器。
委托生成器还可以与父生成器通信,完成后,引发异常的.value
属性StopIteration
作为表达式的值返回yield from
。return <expression>
您可以通过在委托生成器中使用来设置该异常的值,foo()
也可以raise StopIteration(<expression>)
显式使用。
yield from
通过PEP 380: Syntax for Delegating to a Subgenerator被引入到语言中。