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-3.x相关问答推荐

在 Django 中执行 JSONRenderer.render(serialized_student_data.data) 时遇到问题

根据另一列值对多个数据框列进行分组

集合操作:应该只适用于集合,但适用于 dict_keys?

如何在 django 中没有循环的情况下获得前键的前键?

运行 pip install -r requirements.txt 时出错

将名字转换成姓氏、首字母和中间字母的格式

是否将dict转换为一个数据帧,每个值都有重复的键?

Python选择将整数除法向负无穷大的数学原因是什么?

在 Python argparse 中,是否可以配对 --no-something/--something 参数?

在 macbook pro M1 上安装 Tensorflow 时出现“zsh:非法硬件指令 python”

如何在 FastAPI 中的一条路由上捕获任意路径?

调试 Numpy VisibleDeprecationWarning(来自参差不齐的嵌套序列的 ndarray)

在 Ipython 中使用 Pylint (Jupyter-Notebook)

在数据类中创建类变量的正确方法

如何从另一个目录导入 python 包?

压缩 Python 生成器,第二个更短:如何检索被静默消耗的元素

如何使用 Homebrew 在我的 Mac 上默认 Python3.8?

强制 Anaconda 安装 tensorflow 1.14

更新错误“模块”对象不可调用后 pip 不再工作

简单的 get/post 请求在 python 3 中被阻止,但在 python 2 中没有