typing.Protocoltyping.Protocol включает структурную типизацию в Python, что означает, что класс считается совместимым с Protocol, если он реализует требуемые методы и атрибуты — явного наследования не требуется.
По сути, это то, как работает утиная типизация в Python, но сделано явно и проверяемо статическими анализаторами типов вроде mypy.
from typing import Protocol
class Drawable(Protocol):
def draw(self) -> None: ...
class Circle:
def draw(self) -> None:
print("Drawing circle")
def render(shape: Drawable) -> None:
shape.draw()
render(Circle()) # Валидно — Circle удовлетворяет Drawable
Circle нигде не наследуется от Drawable, но принимается, потому что имеет требуемый метод draw.
Номинальная типизация (традиционный подход) требует явного наследования для установления совместимости:
class Circle(Drawable) обязательноСтруктурная типизация через Protocol работает иначе:
isinstance() хорошо работает с ABCruntime_checkable, чтобы isinstance() заработал с ProtocolProtocolВыбирай Protocol, когда:
Класс, удовлетворяющий typing.Protocol, должен явно наследоваться от него или быть зарегистрирован в нём, чтобы статические проверяльщики типов распознали совместимость.
Новый — ещё не проверен сообществом
Вы