嵌套类型暗示不同的结果

Nested Type Hinting Differing Results

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

我在 PyCharm 上使用 python 3.9,但我在 Ipython.

上得到类似的自动完成结果

当使用 typing 模块之外的 Iterable class 时,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) 这样的结果:

您使用了错误的抽象基础 class。 Iterable 仅 promises/requires __iter__ 被实施,而不是 __getitem__。静态地说,bar[1] 不能保证被定义。

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

from typing import Sequence


Data_collection = Sequence[tuple[datetime, str]]

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