因此,基本上,在Python3.7中(据我所知),如果您try 这样做,

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将第一个参数称为"iterable".typeshed as of today也用Iterable[...]来注释第一个参数.

然而,在as_completed的CPython代码中,第一个参数被传递给coroutines.iscoroutine,coroutines.iscoroutine判断它是否是types.GeneratorType的实例.显然,这就是它的本质,它返回True并导致TypeError.

当然,生成器也是可迭代的.这意味着函数not确实像文档所说的那样接受一个迭代数,但只接受一个非生成器的迭代数.

也许这里的其他人可以在这里给背景或思考过程带来额外的光.无论如何,我会争辩说,如果还没有解决这个问题的办法,那么这个问题是值得开始讨论的.

EDIT:显然(并不令人惊讶)我们是not岁,第一批notice this岁的人.感谢@KellyBundy指出这一点.

Python-3.x相关问答推荐

使用魔方无法从图像中识别单个字符

只有在Chrome尚未打开的情况下,打开Chrome后,PySimpleGUI窗口才会崩溃

如何将多个字典合并到一个列中,并为不同的行使用相同的键

为什么空列表也能起作用?

如何立即从asyncio.Task获取异常?

我想使用命令提示符安装 cv2

单击图形时 plotly graph_objects 持久性数据

Pandas 按值和索引对 DF 进行排序

如何将虚拟变量列转换为多列?

在不使用字符串方法的情况下查找字符串最后一个单词的长度 - Python

正则表达式:匹配字符串中的分隔符(字母和特殊字符)以形成新的子字符串

通过 requests 库调用 API 获取访问令牌

理解 Keras 的 ImageDataGenerator 类中的 `width_shift_range` 和 `height_shift_range` 参数

Python 3:函数参数中的省略号?

是否有与 Laravel 4 等效的 python?

作为函数对象属性的 __kwdefaults__ 有什么用?

在不关心项目的情况下运行生成器功能的更简单方法

定义 True,如果没有定义,会导致语法错误

如何使用已打开并使用登录凭据登录的浏览器

在 PyCharm 中配置解释器:请使用不同的 SDK 名称