唯一显著的区别是,当异常从iterable内部引发时会发生什么.使用return iter()
时,FancyNewClass
不会出现在异常回溯中,而使用yield from
时会出现.一般来说,拥有尽可能多的回溯信息是一件好事,尽管在某些情况下,可能需要隐藏包装器.
其他差异:
return iter
必须从globals加载名称iter
——这可能很慢(虽然不太可能显著影响性能),而且可能会被搞乱(尽管任何像这样覆盖globals的人都应该得到他们应得的).
使用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