Тип, описывающий общий протокол с ограничениями.Python

Программы на Python
Anonymous
Тип, описывающий общий протокол с ограничениями.

Сообщение Anonymous »

Учитывая следующий код Python:

Код: Выделить всё

from typing import Protocol, TypeVar

class A: pass
class B(A): pass
class C(A): pass

T = TypeVar("T", B, C, contravariant=True)

class X(Protocol[T]):
def f(self, t: T) -> None: ...

class XTImpl(X[T]):
def f(self, t: T) -> None: pass

class XBImpl(X[B]):
def f(self, t: B) -> None: pass
Как я могу ввести переменную, которая принимает только экземпляр XTimpl, а не экземпляры XBImpl?
Мое истинное использование Дело в том, что у меня есть функции

Код: Выделить всё

def fB(x: type[X[B]]): ...

def fC(x: type[X[C]]): ...

def fT(x):
fB(x)
fC(x)
И я хотел бы ввести аргумент x в fT
Мне, например, нужно что-то вроде просто X (для чего я получаю ошибка «Ожидаемые аргументы типа для универсального класса»).
Если мы изменили T = TypeVar("T", B, C, contravariant=True) на T = TypeVar( "T", A, contravariant=True), то мы могли бы просто использовать X[A].
Но в моем истинном случае использования B и C не являются прямыми потомками общего предка.
Спасибо

Подробнее здесь: https://stackoverflow.com/questions/787 ... onstraints

Вернуться в «Python»