Почему выход из родных сопрограмм правильный синтаксис - PullRequest
4 голосов
/ 12 июля 2019

PEP-380 вводит синтаксис yield from и говорит:

yield from <expr>

где - выражение, вычисляющее итерацию, из которой извлекается итератор.Таким образом, следующее является законным и имеет смысл:

  1. yield от генераторов
  2. yield от generator_based_coroutine (в котором используется декоратор @asyncio.coroutine)

, поскольку обагенераторы и сопрограммы на основе генератора являются экземплярами Iterable.Однако я не понимаю, почему

yield from native_coroutines (using async/await syntax)

является законным?Поскольку PEP-492 утверждает, что собственные сопрограммы не реализуют методы __iter__ и __next__ и, следовательно, не могут быть повторяемыми.Тем не менее, нет PEP, который говорит об этом изменении в поведении yield from для приема объектов сопрограмм, которые возвращаются нативными сопрограммами?

Я знаю, что подпрограммы на основе генератора устареют в 3.10, но я все еще хочу знать, почему yield from работает с нативными сопрограммами.

1 Ответ

1 голос
/ 12 июля 2019

Однако я не понимаю, почему yield from native_coroutines (с использованием синтаксиса async / await) является законным?Поскольку PEP-492 утверждает, что собственные сопрограммы не реализуют методы __iter__ и __next__ и, следовательно, не могут быть повторяемыми.

Однако PEP 492 также заявляет , что« сопрограммы на основе генератора [...] могут yield from нативные объекты сопрограммы.»

Однако я не понимаю, почему yield from native_coroutines является законным?

Поскольку в противном случае нативные сопрограммы нельзя было бы использовать из унаследованного кода, который использовал сопрограммы на основе генератора и yield from.

Например, в некоторый момент после введения async def большинство примитивов asyncio, включая asyncio.sleep, были преобразованы в async def сопрограмм.Если они не поддерживают yield from, преобразование нарушит весь существующий асинхронный код, который ожидал asyncio.sleep с использованием yield from, ранее единственно возможным способом ожидания.Такая обратная несовместимость была бы препятствием для введения нативных сопрограмм, поэтому этого удалось избежать.

...