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