gpt4 book ai didi

python - 如何在类似 future 的对象的 __await__ 中等待?

转载 作者:IT老高 更新时间:2023-10-28 22:20:31 25 4
gpt4 key购买 nike

PEP 0492添加新的 __await__ 魔术方法。实现这个方法的对象变成了future-like object,可以使用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')

我该如何解决?

最佳答案

使用直接 __await__() 调用:

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

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

Yury Selivanov(PEP 492 的作者)为 aioodbc library 推荐了该解决方案。

关于python - 如何在类似 future 的对象的 __await__ 中等待?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33409888/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com