Python 3.6 Типовые подсказки - PullRequest
0 голосов
/ 10 сентября 2018

Я пытаюсь обернуть голову вокруг общих подсказок типа. Прочитав этот раздел в 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.

1 Ответ

0 голосов
/ 12 сентября 2018

Я последовал совету @ Michael0c2a, направился в чат gitter для набора текста на python и задал там вопрос. Ответ был таков: пример верный. Из этого я следую, что

  1. EXP_A и EXP_B действительно определяют типы одного типа
  2. PyCharm из сборки # PC-182.4323.49 не очень хорошо справляется с аннотациями универсального типа.
...