唯一的显着区别是,当从可迭代对象内部引发异常时会发生什么。使用return iter()
yourFancyNewClass
将不会出现在异常回溯中,而将会出现在异常回溯中yield from
。在尽可能多的回溯中获得信息通常是一件好事,尽管在某些情况下您可能希望隐藏包装器。
其他差异:
return iter
必须iter
从全局变量中加载名称-这可能很慢(尽管不太可能显着影响性能),并且可能会引起混乱(尽管像这样覆盖全局变量的任何人都应该得到它们)。
使用,yield from
您可以yield
在之前和之后插入其他表达式(尽管您可以同等使用itertools.chain
)。
如前所述,该yield from
表单会舍弃任何生成器返回值(即raise StopException(value)
,您可以通过编写来解决此问题return (yield from iterator)
。
这是一个比较两种方法的反汇编并显示异常回溯的测试:http ://ideone.com/1YVcSe
使用return iter()
:
3 0 LOAD_GLOBAL 0 (iter)
3 LOAD_FAST 0 (it)
6 CALL_FUNCTION 1 (1 positional, 0 keyword pair)
9 RETURN_VALUE
Traceback (most recent call last):
File "./prog.py", line 12, in test
File "./prog.py", line 10, in i
RuntimeError
使用return (yield from)
:
5 0 LOAD_FAST 0 (it)
3 GET_ITER
4 LOAD_CONST 0 (None)
7 YIELD_FROM
8 RETURN_VALUE
Traceback (most recent call last):
File "./prog.py", line 12, in test
File "./prog.py", line 5, in bar
File "./prog.py", line 10, in i
RuntimeError