gpt4 book ai didi

python - __await__的精确规范

转载 作者:行者123 更新时间:2023-12-03 17:04:13 27 4
gpt4 key购买 nike

《 Python语言引用》指定 object.__await__ 如下:

object.__await__(self)

Must return an iterator. Should be used to implement awaitable objects. For instance, asyncio.Future implements this method to be compatible with the await expression.


就是这样。我发现此规范非常含糊且不够具体(讽刺)。好的,它应该返回一个迭代器,但是它可以是一个任意的迭代器吗?很明显不是:
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期望其协程产生哪些对象的关键在于 task_step_impl中的 _asynciomodule.c

更新:我已经对cpython存储库进行了公关,目的是澄清这个问题: "Clarify the vague specification of object.__await__ "。目前正在审查中。

最佳答案

语言并不关心您返回哪个迭代器。该错误来自asyncio库,该库对必须由迭代器产生的值的种类有特定的想法。 Asyncio需要__await__来生成asyncio future (包括其子类型,例如task)或None。其他库,例如curio和trio,将期望使用不同的值。基本上,异步库没有记录他们对__await__的期望,因为他们认为它是实现细节。
就异步而言,除了协程之外,您还应该使用诸如 future 和任务之类的更高级别的结构,并等待它们。很少需要手动实现__await__,甚至then也应使用它来委派另一个可等待的信号。编写生成并产生自己的值的__await__要求将其与事件循环耦合并了解其内部知识。
您可以将__await__视为编写类似于asyncio的库的工具。如果您是此类库的作者,那么当前的说明就足够了,因为您可以从迭代器中产生所需的任何内容,只有事件循环中的代码才能观察到产生的值。如果您不在该位置,则可能没有实现__await__的业务。

关于python - __await__的精确规范,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63964011/

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