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
相关产品推荐
相关产品推荐

