Выбор ответа Middle Типизация обновлено

Protocol и структурная типизация

Вопрос

Класс FileStore имеет метод save(self, data: bytes) -> None и не наследуется от Storage(Protocol) с тем же методом. Примет ли анализатор FileStore() там, где ожидается Storage?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Да: Protocol проверяет структуру, наследование не нужно. Протоколы реализуют структурную (утиную) типизацию: подходит любой класс с нужными методами и сигнатурами.

Варианты ответа

  1. Нет: нужно наследоваться от Storage
  2. Да: Protocol проверяет структуру, наследование не нужноправильный ответ
  3. Нет: нужно вызвать Storage.register(FileStore)
  4. Да, но только если Storage помечен @runtime_checkable

Разбор

Протоколы реализуют структурную (утиную) типизацию: подходит любой класс с нужными методами и сигнатурами. Регистрация через register это механизм abc.ABC. @runtime_checkable нужен только для isinstance во время выполнения, статической проверке он не требуется.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.