Уже, наверное, не актуально. Но, видимо: TypeVar
https://proproprogs.ru/python_base/python3-annotac...
Давайте теперь воспользуемся этой функцией. Если ее вызвать так:
geom = factory_point(Geom)
point = factory_point(Point2D)
то с аннотациями никаких конфликтов не будет. Но, если мы дополнительно аннотируем и переменные geom и point соответствующими типами:
geom: Geom = factory_point(Geom)
point: Point2D = factory_point(Point2D)
то во второй строчке появится подсветка кода. Очевидно это из-за того, что мы явно указываем ожидаемый тип Point2D, а в определении функции прописан тип Geom. И, так как Geom – базовый класса для Point2D, то возникает конфликт аннотаций.
Для исправления таких ситуаций в Python можно описывать некие общие типы с помощью класса TypeVar. Например:
T = TypeVar("T", bound=Geom)
Мы здесь объявили универсальный тип с именем T и сказали, что он должен быть или классом Geom или любым его дочерним классом. Далее, в самой функции, достаточно прописать этот тип:
def factory_point(cls_geom: Type[T]) -> T:
return cls_geom()
и он будет автоматически вычисляться при вызове функции. Когда передается класс Geom, то T будет соответствовать этому типу, а когда передается Point2D – то тип T будет Point2D. И так далее. Вот смысл универсальных типов при формировании аннотаций.