Ответ 1
Единственное существенное различие заключается в том, что происходит, когда исключение возникает из итерируемого. Используя return iter()
, ваш FancyNewClass
не появится в трассировке исключения, тогда как с yield from
он будет. Как правило, хорошо иметь как можно больше информации о трассировке, хотя могут быть ситуации, когда вы хотите скрыть свою обертку.
Другие отличия:
-
return iter
должно загружать имя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