• Какую аннотацию использовать, для описания дочерних классов?

    @7GR
    Уже, наверное, не актуально. Но, видимо: 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. И так далее. Вот смысл универсальных типов при формировании аннотаций.
    Ответ написан
    Комментировать
  • Как исправить ошибку в Python Selenium?

    @7GR
    Ваша версия ChromeDriver поддерживает только 77-й Chrome браузер. Или ставьте версию браузера 77, или скачайте ChromeDriver той же версии что у Вас Chrome.

    Или - https://github.com/SergeyPirogov/webdriver_manager и забыть об этом.
    Ответ написан