Python 3.6通用类型提示

时间:2018-09-10 10:32:32

标签: python python-3.x generics types type-hinting

我试图将我的头放在通用类型提示上。通过阅读PEP 483中的this section,我得到的印象是

SENSOR_TYPE = TypeVar("SENSOR_TYPE")
EXP_A = Tuple[SENSOR_TYPE, float]
class EXP_B(Tuple[SENSOR_TYPE, float]):
    ...

EXP_AEXP_B应该标识相同的类型。但是,在PyCharm#PC-181.4203.547中,只有EXP_B可以正常工作。经过调查,我发现EXP_B拥有__dict__成员,而EXP_A没有。

这让我感到奇怪,这两种类型定义实际上意味着同义吗?

编辑:我的最初目标是设计2元组的通用类EXP,其中第二个元素始终为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)

(PEP 484中的The section on user defined generic types在我的原始代码示例中将EXP的定义描述为与EXP_B等效。)

问题在于PyCharm抱怨instance的类型作为参数Expected type EXP (matched generic type EXP[V]), got Tuple[str, float] instead。改为使用EXP = Tuple[T, float],它表示:Expected type 'Tuple[Any]' (matched generic type Tuple[V]), got Tuple[str, float] instead

1 个答案:

答案 0 :(得分:0)

我遵循@ Michael0c2a的建议,转到python输入gitter chat,并在那里询问问题。答案是这个例子是正确的。 从这开始,我遵循了

  1. EXP_AEXP_B确实定义了相同类型的类型
  2. 自版本#PC-182.4323.49起的PyCharm不能很好地处理通用类型注释。