【发布时间】:2021-01-05 21:07:44
【问题描述】:
Python 语言参考指定object.__await__ 如下:
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 事件循环期望迭代器产生一种特定类型的对象。那么它应该究竟产生什么? (为什么没有记录?)
编辑:据我所知,这在任何地方都没有记录。但我一直在自己调查,我认为了解asyncio 期望其协程产生哪些对象的关键在于_asynciomodule.c 中的task_step_impl。
更新:我已经对 cpython 存储库进行了 PR,目的是澄清这一点:"Clarify the vague specification of object.__await__"。目前正在审核中。
【问题讨论】:
-
删除了我的答案。我以为那里有没有的信息。
-
请注意,您无需阅读 C 代码即可理解 asyncio 事件循环。 C 代码只是规范 Python code 的加速版本,为了诸如 PyPy 等非 C 支持的实现,它被保留并积极维护。
标签: python async-await python-asyncio