嵌套类型暗示不同的结果
Nested Type Hinting Differing Results
我一直在尝试使用类型提示来加强一些 classes 代码。我正在努力解决嵌套问题。感兴趣的函数的参数是具有已知类型的对象的可迭代容器。我在让我的 IDE 识别内部类型时遇到问题(这很方便。)
我在 PyCharm 上使用 python 3.9,但我在 Ipython.
上得到类似的自动完成结果
当使用 typing
模块之外的 Iterable
class 时,IDE 无法“看穿”内部类型。 Collection
同样如此。但是在外部容器上使用 list
或 tuple
时可以。
这是一个 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,而不是您的代码。)
我一直在尝试使用类型提示来加强一些 classes 代码。我正在努力解决嵌套问题。感兴趣的函数的参数是具有已知类型的对象的可迭代容器。我在让我的 IDE 识别内部类型时遇到问题(这很方便。)
我在 PyCharm 上使用 python 3.9,但我在 Ipython.
上得到类似的自动完成结果当使用 typing
模块之外的 Iterable
class 时,IDE 无法“看穿”内部类型。 Collection
同样如此。但是在外部容器上使用 list
或 tuple
时可以。
这是一个 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,而不是您的代码。)