PEP 0492 добавляет новый магический метод __await__
. Объект, реализующий этот метод, становится объектом, подобным будущему, и его можно ожидать с помощью await
. Ясно:
import asyncio
class Waiting:
def __await__(self):
yield from asyncio.sleep(2)
print('ok')
async def main():
await Waiting()
if __name__ == "__main__":
loop = asyncio.get_event_loop()
loop.run_until_complete(main())
Хорошо, но что, если я хочу назвать определенную функцию async def
вместо asyncio.sleep
? Я не могу использовать await
, потому что __await__
не является функцией async
, я не могу использовать yield from
, потому что для встроенных сопрограмм требуется выражение await
:
async def new_sleep():
await asyncio.sleep(2)
class Waiting:
def __await__(self):
yield from new_sleep() # this is TypeError
await new_sleep() # this is SyntaxError
print('ok')
Как я могу его решить?