You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python object.__await__规范模糊及asyncio迭代器返回对象问询

关于object.__await__的规范澄清与实现细节

如果你试过自己实现可等待对象的__await__方法,肯定会踩过这个坑:Python官方《Python语言参考》里对object.__await__(self)的描述非常模糊——只说它必须返回一个迭代器,用于实现asyncio.Future这类兼容await表达式的可等待对象,但实际这么写却会直接报错。

举个例子,运行这段测试代码:

import asyncio
class Spam:
    def __await__(self):
        yield from range(10)
async def main():
    await Spam()
asyncio.run(main())

你会得到RuntimeError: Task got bad yield: 0的错误。这说明asyncio的事件循环对__await__返回的迭代器有特定的返回值要求,而这一点完全没出现在原文档里。

我特意去翻了CPython的源码,发现核心逻辑在_asynciomodule.c的task_step_impl函数中——事件循环期望迭代器返回的是特定的内部对象,而不是随便什么值。

好在这个文档缺失的问题已经被修复了:有开发者提交了名为「Clarify the vague specification of object.await」的PR,目前已经合并,从Python 3.10及以后的版本开始,官方文档会更新这部分内容,补上之前没说明的细节。

内容的提问来源于stack exchange,提问作者Anakhand

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 12:52:28