【问题标题】:Nested Type Hinting Differing Results嵌套类型提示不同结果
【发布时间】:2022-01-26 15:40:08
【问题描述】:

我一直在尝试使用类型提示来加强几类代码。我正在努力解决嵌套问题。感兴趣的函数的参数是具有已知类型的对象的可迭代容器。我无法让我的 IDE 识别内部类型(这很方便。)

我在 PyCharm 上使用 python 3.9,但我在 Ipython 中得到了类似的自动完成结果。

当使用typing 模块之外的Iterable 类时,IDE 无法“透视”内部类型。 Collection 也是如此。但在外部容器上使用listtuple 时可以。

这是 IDE 问题还是有其他方法可以打包?能够向这个函数发送任何类型的可迭代,而不是硬编码它会很好......

from datetime import datetime
from typing import Iterable

Data_collection = Iterable[tuple[datetime, str]]
Data_list = list[tuple[datetime, str]]

def foo(bar: Data_collection):
    bar[1][0].    # no type-hint on inner obj

def foo2(bar: Data_list):
    bar[1][0].    # good type-hint on inner obj

像这样获取我 (PyCharm) 的结果:

【问题讨论】:

  • 在你问这个问题之前,我从来没有注意到这让我感到困扰。不错。
  • 这纯粹是一个 IDE 问题,但请考虑一下:Iterable 不一定支持索引,因此 bar[1] 甚至可能无效。 Iterable 唯一承诺的是 __iter__ 方法。如果你想要一些可以被索引的东西,你想要Sequence
  • 啊,@chepner。是的,在这种情况下,索引并不重要,我认为我对索引的错误使用管控了这一点。当我以适当的方式遍历 iterable 时,PyCharm 会按预期工作。

标签: python pycharm python-typing


【解决方案1】:

您使用了错误的抽象基类。 Iterable 只承诺/需要 __iter__ 来实现,而不是 __getitem__。从静态上讲,bar[1] 不能保证被定义。

要指定任何支持索引的类型,请改用Sequence

from typing import Sequence


Data_collection = Sequence[tuple[datetime, str]]

现在,无论bar 的运行时类型如何,您的IDE 都可以假定bar.__getitem__ 已定义并返回tuple。 (您的特定 IDE是否做出该假设取决于 IDE,而不是您的代码。)

【讨论】:

  • 好收获。如上所述,当我从背后抬起头并使用迭代器(这很好)时,它会按预期工作。如果我输入Sequence 并索引它也可以!好收获
猜你喜欢
  • 2022-10-06
  • 1970-01-01
  • 2020-02-12
  • 2019-08-17
  • 2021-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多