如何在类似于future对象的__await__方法内等待?

9 浏览
0 Comments

如何在类似于future对象的__await__方法内等待?

PEP 0492添加了新的`__await__`魔法方法。实现了这个方法的对象将成为类似于future的对象,并可以使用`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()  # 这是类型错误
        await new_sleep()  # 这是语法错误
        print('ok')

我该如何解决这个问题?

0