Вопрос проверяет понимание структурной типизации и использования Protocol для определения интерфейсов.
Protocol определяет структурную типизацию — объект считается подходящим, если имеет нужные методы и атрибуты, независимо от наследования. Это полезно для утиной типизации с проверкой типов.
Protocol из модуля typing позволяет определять интерфейсы через структурную типизацию, где совместимость определяется наличием методов, а не наследованием.
Основные концепции:
Структурная типизация: объект подходит, если имеет требуемую структуру
Утиная типизация: "если ходит как утка и крякает как утка, то это утка"
Статическая проверка: mypy проверяет соответствие Protocol
Пример использования:
from typing import Protocol
class Readable(Protocol):
def read(self) -> str: ...
class FileReader:
def read(self) -> str:
return "file content"
class StringReader:
def read(self) -> str:
return "string content"
def process_readable(reader: Readable) -> None:
print(reader.read())
# Оба объекта подходят, хотя не наследуют от Readable
process_readable(FileReader())
process_readable(StringReader())Применение:
Определение интерфейсов для плагинов
Тестирование с mock-объектами
Описание ожидаемого поведения функций