Почему небезопасно использовать в аргументе общий тип self?Python

Программы на Python
Anonymous
Почему небезопасно использовать в аргументе общий тип self?

Сообщение Anonymous »

В документе mypy говорится:

Обратите внимание, что mypy позволяет использовать общие типы self определенными небезопасными способами для поддержки распространенных идиом. Например, использование универсального типа self в типе аргумента допускается, даже если это небезопасно.

Затем упоминается пример использования универсального типа self в аргумент:

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

from typing import TypeVar

T = TypeVar("T")

class Base:
def compare(self: T, other: T) -> bool:
return False

class Sub(Base):
def __init__(self, x: int) -> None:
self.x = x

# This is unsafe (see below) but allowed because it's
# a common pattern and rarely causes issues in practice.
def compare(self, other: Sub) -> bool:
return self.x > other.x

b: Base = Sub(42)
b.compare(Base())  # Runtime error here: 'Base' object has no attribute 'x'

Я не могу понять, что здесь «небезопасного». Основная проблема заключается в том, что переменной b присвоен неточный тип (b:Base)
Так какой смысл в документе?PS: Смысл «небезопасного» в документе заключается в том, что он хорошо проверяет тип, но создает исключение во время выполнения. Но я не могу понять, почему это связано с аннотацией другого: T в Base.compare. Я думаю, это связано с неточным типом b, который разработчик должен был привести к Sub.
Другими словами: что мне делать, если у меня есть метод, который принимает то же самое тип объекта такой же, как и другие его аргументы?

Подробнее здесь: https://stackoverflow.com/questions/778 ... n-argument

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