Каковы применения 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.)

Другие вопросы по тегам