Python 3.6 泛型类型提示

weh*_*lae 5 python generics types type-hinting python-3.x

我正在尝试理解通用类型提示。阅读PEP 483 中的这一部分,我得到的印象是

SENSOR_TYPE = TypeVar("SENSOR_TYPE")
EXP_A = Tuple[SENSOR_TYPE, float]
class EXP_B(Tuple[SENSOR_TYPE, float]):
    ...
Run Code Online (Sandbox Code Playgroud)

EXP_A并且EXP_B应该识别相同的类型。然而,在 PyCharm #PC-181.4203.547 中,只能EXP_B按预期工作。经过调查,我注意到EXP_B有一个__dict__成员,而EXP_A没有。

这让我想知道,这两种类型定义实际上是同义的吗?

编辑:我最初的目标是设计一个通用的EXP2 元组类,其中第二个元素始终是 a float,第一个元素类型是可变的。我想按如下方式使用这个泛型类的实例

from typing import TypeVar, Tuple, Generic

T = TypeVar("T")


class EXP_A(Tuple[T, float]):
    ...


EXP_B = Tuple[T, float]


V = TypeVar("V")


class MyClass(Generic[V]):
    def get_value_a(self, t: EXP_A[V]) -> V:
        return t[0]

    def get_value_b(self, t: EXP_B[V]) -> V:
        return t[0]


class StrClass(MyClass[str]):
    pass


instance = "a", .5

sc = StrClass()
a: str = sc.get_value_a(instance)
b: str = sc.get_value_b(instance)
Run Code Online (Sandbox Code Playgroud)

( PEP 484 中有关用户定义泛型类型的部分EXP描述了与我的原始代码示例中的等效的定义EXP_B。)

instance问题是 PyCharm 抱怨作为参数的类型:

Expected type EXP (matched generic type EXP[V]), got Tuple[str, float] instead`. With `EXP = Tuple[T, float]` instead, it says: `Expected type 'Tuple[Any]' (matched generic type Tuple[V]), got Tuple[str, float] instead.
Run Code Online (Sandbox Code Playgroud)

weh*_*lae 5

我听从了 @Michael0c2a 的建议,前往 python 中输入 gitter chat,并在那里提出了问题。答案是这个例子是正确的。由此,我遵循

  1. EXP_A并且EXP_B确实定义了相同类型的类型
  2. PyCharm 自 build #PC-182.4323.49 起并不能很好地处理泛型类型注释。