在Python中,大多数yield from的例子都是这样解释的
yield from foo()
类似于
for x in foo(): yield x
另一方面,它似乎并不完全相同,并且有一些魔法。我对使用一个执行我不理解的魔法的函数感到有点不安。关于它的魔力我必须知道什么yield from
以避免陷入魔法做出我意想不到的事情的情况?我应该注意魔法提供了哪些优势?
When foo()
返回一个正则迭代,两者是等价的。当“魔法”发挥作用时foo()
is a 发电机也。就在那一刻,yield from foo()
and for x in foo(): yield x
情况存在重大差异。
发电机可以是sent数据也是如此,使用generator.send() method https://docs.python.org/3/reference/expressions.html#generator.send。当您使用for
循环,yield x
表达式“接收”发送的数据;这foo()
生成器永远不会看到这个。但是当你使用yield from
发送的数据直接发送到任何地方yield
委托生成器当前暂停的表达式。换句话说,yield from
传递发送的数据,以便委托生成器可以接收它。
您还可以提出例外情况in一个发电机,具有generator.throw() https://docs.python.org/3/reference/expressions.html#generator.throw;与for
循环情况下,异常是从yield x
线,同时与yield from
异常再次传递;异常是在内部引发的foo()
反而。
综合起来,这意味着yield from
在本质上在委托迭代期间替换当前生成器。
完成后,委托生成器还可以与父生成器进行通信.value
的属性StopIteration
引发的异常作为值返回yield from
表达。您可以使用以下方法设置该异常的值return <expression>
在委托给foo()
发电机,或者你可以使用raise StopIteration(<expression>)
明确地。
yield from
被引入到该语言中PEP 380:委托给子生成器的语法 http://www.python.org/dev/peps/pep-0380/.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)