我试图将我的头放在通用类型提示上。通过阅读PEP 483中的this section,我得到的印象是
SENSOR_TYPE = TypeVar("SENSOR_TYPE")
EXP_A = Tuple[SENSOR_TYPE, float]
class EXP_B(Tuple[SENSOR_TYPE, float]):
...
EXP_A
和EXP_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
。
答案 0 :(得分:0)
我遵循@ Michael0c2a的建议,转到python输入gitter chat,并在那里询问问题。答案是这个例子是正确的。 从这开始,我遵循了
EXP_A
和EXP_B
确实定义了相同类型的类型