Абстрагирование над конструкторами типов в Python с помощью аннотаций типов - PullRequest
0 голосов
/ 07 сентября 2018

Я хочу статически принудить, чтобы метод класса возвращал значение, заключенное в некоторый абстрактный тип, о котором я ничего не знаю:

например. с учетом абстрактного класса

F = ???    

class ThingF(Generic[F]):
    @abstractmethod
    def action(self) -> F[Foo]:
        ...

Я хочу, чтобы иметь возможность статически проверить, что это неверно:

class ThingI(ThingF[List]):
    def action(self) -> Foo:
        ...

потому что action не возвращает List[Foo].

Однако приведенное выше объявление для ThingF даже не выполняется, поскольку Generic ожидает, что его аргументы являются переменными типа, и я не могу найти способ сделать F переменную типа "с отверстием".

Оба

F = TypeVar('F')

и

T = TypeVar('T')
F = Generic[T]

не работают, потому что либо TypeVar не является подписным, либо Generic[~T] не может использоваться в качестве переменной типа.

По сути, мне нужна «переменная типа с более высоким родом», абстракция конструктора типа, если хотите. То есть что-то, что говорит: «F может быть любым типом, который берет другой тип, чтобы произвести конкретный тип».

Есть ли способ выразить это с помощью аннотаций типа Python и проверить его статически с помощью mypy?

1 Ответ

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

К сожалению, система типов (как описано в PEP 484) не поддерживает типы с более высоким родом - здесь есть некоторые важные обсуждения: https://github.com/python/typing/issues/548.

Возможно, что Mypy и другие инструменты проверки типов получат поддержку для них в будущем, но я не задерживаю дыхание. Для этого потребовалась бы довольно сложная работа по реализации.

...