编写静态类型 python 时获取查找对象类型的好方法是什么?

What is a good way to get find object types when writing statically typed python?

当尝试编写静态类型 python 时,查找更复杂 python 对象类型的好方法是什么?

例如,我认为 x 的类型注释在这里是正确的:

from itertools import combinations
from typing import Union, Iterator
x: Union[Iterator[tuple[int]]] =  combinations([1,2,3], 2)

不过,我很想通过像这样简单的操作来弄清楚类型:

print(type(itertools.combinations))
<class 'itertools.combinations'>

但这给出了错误的结果,即 <class 'itertools.combinations'> 不是 Union[Iterator[tuple[int]]],我认为这是 x.

的正确类型注释

此外,PyCharm 告诉我 Union[Iterator[tuple[int]]] 是正确的类型,但是当我单击文档时 link 它只给我 this 这是标准 python itertools 的文档,我在那里看不到任何类型注释。所以想知道是否有办法访问 PyCharm 在这里所做的事情...

"PyCharm 告诉我 Union[Iterator[tuple[int]]] 是正确的类型" 我认为 PyCharm 告诉你没有冲突,但这并不意味着它是实际正确的类型,这解释了为什么它允许 Union 在那里。除非你想暗示 Union[X, None],但你会想要 Optional

请注意,查找答案和检查答案是不同的 - 您正在寻找可以找到答案的东西,PyCharm 正在检查您的答案。这就像数学,如果你有答案,很容易填写一个公式并检查它是否有效,但仅给出公式,需要复杂的工作来找出答案 - 并且可能有多个正确答案。

这也更广泛地适用于 print(type(itertools.combinations))

你的情况下,期望的正确return类型是Iterator[tuple[int]],但如果你调用combinations(['a','b','c'], 2),它将是Iterator[tuple[str]] - 所以 return 类型需要用你调用函数的类型进行参数化,使事情变得更加复杂。

简而言之,没有您正在寻找的东西,尽管有一些第三方工具可能会让您接近,例如用户@MegaIng 建议的 mypy 中的 reveal_type。 (我没有直接使用它的经验,但它看起来值得检查一些用例)