73

根据PEP-484,我们应该能够键入提示生成器函数,如下所示:

from typing import Generator

def generate() -> Generator[int, None, None]:
    for i in range(10):
        yield i

for i in generate():
    print(i)

但是,列表推导在 PyCharm 中给出了以下错误。

预期的 'collections.Iterable',得到了 'Generator[int, None, None]' 而不是 ... (⌘F1)

知道为什么 PyCharm 将其视为错误吗?


阅读一些答案后进行一些澄清。我正在使用 PyCharm Community Edition 2016.3.2(最新版本)并已导入typing.Generator(在代码中更新)。上面的代码运行得很好,但是 PyCharm 认为这是一个错误:

在此处输入图像描述

所以,我想知道这实际上是一个错误还是 PyCharm 中不受支持的功能。

4

2 回答 2

83

您需要导入typing模块。根据文档:

生成器函数的返回类型可以通过模块Generator[yield_type, send_type, return_type]提供 的泛型类型进行注解typing.py

试试这种方式:

from typing import Generator


def generate() -> Generator[int, None, None]:
    for i in range(10):
        yield i

以上将有预期的结果:

l = [i for i in generate()]

输出:

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]


正如评论中所指出的,您可能不会使用最新版本的 PyCharm。尝试切换到2016.3.2版本,您可能会没事。不幸的是,根据@AshwiniChaudhary 的评论,这是一个众所周知的错误。

此外,报告的问题(针对 PyCharm 的最后一个版本)是在去年 12 月提交的。他们可能修复了它并将修改推送到相同的版本。

于 2017-03-01T12:04:56.463 回答
20

这不是问题的直接答案,但我认为这是一个更好的解决方案。

我正在使用下面的打字规范,Iterator[int]而不是使用生成器。验证正常。我认为它更清晰。它更好地描述了代码意图,并被Python 文档推荐。

from typing import Iterator

def generate() -> Iterator[int]:
    for i in range(10):
        yield i

如果您将生成器更改为列表或其他可迭代对象,它也将允许将来进行重构。

我正在使用带有 PyLance 的 Visual Studio Code 进行输入验证。PyCharm mypy 应该具有相同的行为。

于 2021-10-01T21:29:27.183 回答