Я пытаюсь обернуть голову вокруг общих подсказок типа. Прочитав этот раздел в PEP 483, у меня сложилось впечатление, что в
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
- нет.
Это заставило меня задуматься, действительно ли оба типа определения типа должны быть синонимами?
Редактировать: Моя первоначальная цель состояла в том, чтобы создать общий класс EXP
из 2-х кортежей, где второй элемент всегда является 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 это определение EXP
описывается как эквивалентное EXP_B
в моем исходном примере кода.)
Проблема в том, что PyCharm жалуется на тип instance
в качестве параметра:
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.