Gerasimov Mikhail Gerasimov Mikhail -4 years ago 116
Python Question

How can I await inside future-like object's __await__?

PEP 0492 adds new

__await__
magic method. Object that implements this method becomes future-like object and can be awaited using
await
. It's clear:

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())


Ok, but what if I want to call some
async def
defined function instead of
asyncio.sleep
? I can't use
await
because
__await__
is not
async
function, I can't use
yield from
because native coroutines requires
await
expression:

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')


How can I solve it?

Answer Source

Use direct __await__() call:

async def new_sleep():
    await asyncio.sleep(2)

class Waiting:
    def __await__(self):
        return new_sleep().__await__()

The solution was recommended by Yury Selivanov (the author of PEP 492) for aioodbc library

Recommended from our users: Dynamic Network Monitoring from WhatsUp Gold from IPSwitch. Free Download