Когда сопрограммы впервые появились в Python 3.4, они были реализованы с использованием генераторов:
import asyncio
from typing import Generator
@asyncio.coroutine
def test1():
pass
assert isinstance(test1(), Generator)
Это было не потому, что сопрограммы всегда должны быть генераторами, просто так они и были: это был самый удобный способ реализовать их.
Начиная с Python 3.5 сопрограммы получили новый синтаксис async def
/ await
, который одновременно чище и помогает различать guish абстракция (сопрограмма) от его реализации подробно (генератор).
Кажется, что сопрограммы нового стиля были также исправлены, чтобы показать, что они не должны рассматриваться как генераторы:
async def test2():
pass
assert not isinstance(test2(), Generator)
Короче говоря, забудьте о генераторах, когда дело с сопрограммами. Если вы работаете с абстракциями asyncio, такими как сопрограммы, вам следует работать с ними, а не с деталями их реализации.