Каковы применения yield в выражении понимания или генератора?
В документации Python 3.7 упоминается, что yield
выражения не рекомендуется "в неявно вложенных областях, используемых для реализации пониманий и выражений-генераторов", с ожиданием удаления для 3.8:
Из-за их побочных эффектов на содержащую область действия выражения yield не допускаются как часть неявно определенных областей, используемых для реализации пониманий и выражений генератора (в Python 3.7 такие выражения при компиляции генерируют DeprecationWarning, в Python 3.8+ они генерируют SyntaxError),
Я пытаюсь понять, на что влияет это изменение (ломается?), Потому что на первый взгляд оно затрагивает довольно эзотерический сценарий. Есть ли веская причина для yield
в понимании списка или генератор выражения в первую очередь?
До сих пор я придумал эти (довольно бессмысленные) примеры, которые должны быть недопустимы в Python 3.8:
>>> list((yield i) for i in range(5))
[0, None, 1, None, 2, None, 3, None, 4, None]
>>> list([(yield i) for i in range(5)])
[0, 1, 2, 3, 4]
1 ответ
Каковы применения yield в выражении понимания или генератора?
Ничего такого.
Эта "особенность" была подтверждена как ошибка и находится в процессе устаревания для python3.7, и будет полностью удалена в python3.8, что приведет к SyntaxError
если используется.
Из документов,
Выражение доходности (оба
yield
а такжеyield from
пункты) теперь устарели в выражениях и выражениях-генераторах (за исключением итеративного выражения в крайнем левом предложении for). Это гарантирует, что понимания всегда немедленно возвращают контейнер соответствующего типа (а не потенциально возвращают объект итератора генератора), в то время как выражения генератора не будут пытаться чередовать свой неявный вывод с выводом любых явных выражений yield.В Python 3.7 такие выражения испускают
DeprecationWarning
при компиляции в Python 3.8+ они будут излучатьSyntaxError
, (Внесено Сергеем Сторчака в bpo-10544.)