gpt4 book ai didi

python-3.x - asyncio.as_completed() 应该接受 `Iterable` ,但如果输入是 `Generator` 就会崩溃?

转载 作者:行者123 更新时间:2023-12-05 04:19:35 25 4
gpt4 key购买 nike

所以,基本上,在 Python 3.7 中(据我所知)如果你尝试这样做,

import asyncio


async def sleep():
asyncio.sleep(1)


async def main():
tasks = (sleep() for _ in range(5))
for task in asyncio.as_completed(tasks):
result = await task


if __name__ == "__main__":
asyncio.run(main())

它崩溃了

TypeError: expect a list of futures, not generator

但是类型提示清楚地指定它接受 Iterable,而 Generator 就是。

如果将 tasks 转换为 list,它当然可以工作,但是......我错过了什么?

为什么它会受到列表的约束?我不明白为什么它不允许生成器。

最佳答案

你是对的。此处的文档与实际行为不一致。

official documentation将第一个参数称为“可迭代”。和 typeshed as of today还用 Iterable[...] 注释了第一个参数。

但是,在 CPython 代码中 as_completed第一个参数传递给 coroutines.iscoroutine , 它会检查它是否是 types.GeneratorType 的一个实例.显然,这就是它返回 True 并导致 TypeError 的原因。

当然,生成器也是可迭代的。这意味着该函数实际上接受文档声明的可迭代对象,但仅接受非生成器可迭代对象。

也许这里的其他人可以进一步阐明这里的背景或思维过程。无论如何,如果尚不存在解决此问题的方法,我认为这值得提出一个问题。

编辑:显然(毫不奇怪)我们不是第一个notice this .感谢@KellyBundy 指出这一点。

关于python-3.x - asyncio.as_completed() 应该接受 `Iterable` ,但如果输入是 `Generator` 就会崩溃?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74775348/

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