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
没有。
这让我想知道,这两种类型定义实际上是同义的吗?
编辑:我最初的目标是设计一个通用的EXP
2 元组类,其中第二个元素始终是 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)
我听从了 @Michael0c2a 的建议,前往 python 中输入 gitter chat,并在那里提出了问题。答案是这个例子是正确的。由此,我遵循
EXP_A
并且EXP_B
确实定义了相同类型的类型