【问题标题】:How to type hint a generator in Python 3?Python 3.6 中的类型提示生成器
【发布时间】:2017-07-20 17:53:57
【问题描述】:

根据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 中不支持的功能。

【问题讨论】:

  • 将代码更改为:ideone.com/IwHbT0 会发生什么?
  • 我使用的是 Pycharm 2017.1 EAP,它似乎已修复。
  • EAP 确实解决了这个问题;非常感谢。
  • @MikeWilliamson 是的,这是一个编辑:stackoverflow.com/revisions/42531143/2。看起来真正的问题是 PyCharm,而不是 Python。最重要的答案也已更新以提及这一点。根据 SO 标准,我不知道应该如何处理这个令人困惑的 Q/A。

标签: python python-3.x pycharm python-typing


【解决方案1】:

您需要导入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]


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

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

【讨论】:

  • 不应该导致NameError for Generator for OP?
  • @AshwiniChaudhary 为什么会这样?我刚刚对其进行了测试,它的工作原理完全一样。
  • 问题不在于输出,问题在于 PyCharm 抱怨返回类型。你在 PyCharm 中测试过吗?
  • @AshwiniChaudhary 是正确的,OP 已经进行了导入(即使在他们的代码 sn-p 中没有显示),否则他们会得到一个 NameError
  • send_type 是什么?
【解决方案2】:

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

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

from typing import Iterator

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

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

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

【讨论】:

猜你喜欢
  • 2019-02-14
  • 2017-05-12
  • 1970-01-01
  • 2021-07-28
  • 2014-12-20
  • 2017-05-11
  • 2018-12-12
相关资源
最近更新 更多