Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

+717новых вакансий за сутки·60 871вакансия открыта сейчас·Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Новые вакансии в TelegramРаботодателям
Talanto
Вакансии
Компании5 951
РезюмеAIПодготовкаСтатьи
ТарифыТарифы
Войти

Не нашли подходящее?

Пусть нужная вакансия найдёт вас сама.

  1. Подборка в TelegramНовые вакансии по вашему фильтру — сразу в бота.Подключить
  2. Мэтчи по резюмеЗагрузите резюме — покажем, где вы подходите лучше всего.Загрузить
  3. Сохранить фильтрНастройте поиск один раз и возвращайтесь к новым вакансиям.Настроить
Что нового на TalantoTalanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Для работодателей

Опубликуйте вакансию — отклики придут в ваш кабинет.

  1. Вакансиябесплатно
  2. Откликиконтакты бесплатно
  3. Наймэтапы и интервью

40 компаний публикуют вакансии напрямую · 4 391 кандидат открыт к предложениям

Разместить вакансию

Популярные направления

Все подборки
  • Python9 224
  • Облачные технологии6 770
  • QA вакансии2 176
  • Android1 322
  • Инженер данных940
  • Продакт-менеджер435

Разработка

  • Backend вакансии1 317
  • iOS1 239
  • AI вакансии608
  • Fullstack вакансии523
  • Frontend вакансии456
  • Mobile вакансии28

По стеку

  • Go5 445
  • Java3 175
  • Kotlin1 119
  • Node.js1 026
  • Rust949
  • .NET666
  • PHP311
  • C++273
  • C#210

DevOps и инфраструктура

  • Kubernetes4 025
  • Linux-инфраструктура3 060
  • DevOps вакансии2 713
  • Terraform / IaC2 214
  • Мониторинг и Observability1 106
  • CI/CD919
  • SRE341
  • Кибербезопасность90

Аналитика и данные

  • Аналитик данных555
  • Data Scientist513
  • Бизнес-аналитик431
  • Системный аналитик65

Другие направления

  • Проджект-менеджер160
  • UI/UX дизайн77
  • Ручное тестирование14

По регионам

  • Вакансии в США29 375
  • Вакансии в Европе11 048
  • Работа в России3 627
  • Вакансии в Канаде2 514

По формату

  • Удалённые вакансии48 640
  • Релокация в США29 375
  • Гибридная работа5 790
  • Офисная работа4 553

По уровню

  • Senior вакансии25 029
  • Middle вакансии13 245
  • Junior вакансии4 377

Сейчас нанимают

Все компании
  • Wise191 вакансия
  • Rakuten188 вакансий
  • ASML163 вакансии
  • Grab134 вакансии
  • Celonis48 вакансий
  • Spotify37 вакансий
  • Adyen28 вакансий
  • Infobip28 вакансий
  • Monzo20 вакансий
  • Darktrace17 вакансий

Вакансии из 344 источников: карьерные страницы компаний и джоб-борды.

КомпанииО насНовостиПубличная офертаУсловия использованияПолитика конфиденциальностиПоддержка
←К теме PythonВсе вопросы
PythonMiddleТеория

Что такое Protocol в typing?

В закладки
Сначала попробуйте ответить сами30 секунд
Сравнить с ответом ↓

Protocol (typing) — structural typing: type checker считает класс совместимым с Protocol, если он реализует те же методы и атрибуты, без наследования. Это статический duck-typing. @runtime_checkable добавляет isinstance-проверку, но проверяет только наличие имён, не сигнатуры.

Что это и зачем

typing.Protocol (PEP 544, Python 3.8+) реализует structural subtyping: тип совместим с Protocol, если у него есть все нужные атрибуты и методы, независимо от того, наследуется ли он от Protocol-класса.

from typing import Protocol

class Sender(Protocol):
    def send(self, message: str) -> None: ...

class ConsoleSender:        # не наследуется от Sender
    def send(self, message: str) -> None:
        print(message)

class EmailSender:
    def send(self, message: str) -> None:
        smtp.sendmail(...)

def notify(sender: Sender, msg: str) -> None:
    sender.send(msg)

notify(ConsoleSender(), "hi")     # ok для mypy/pyright
notify(EmailSender(), "hi")       # тоже ok

Protocol vs ABC

  • ABC (abc.ABC) — nominal subtyping: класс должен наследоваться от ABC. Подходит, когда вы владеете кодом и хотите явный контракт.
  • Protocol — structural: подходит любой класс с нужными методами. Идеально для интеграции со сторонним кодом и dependency injection, когда нельзя/неудобно править иерархию.
  • Protocol можно использовать как тип параметра, ABC — и как тип, и как базу для миксинов.

@runtime_checkable

По умолчанию Protocol — статический. Чтобы работал isinstance(obj, Sender), добавьте декоратор:

from typing import Protocol, runtime_checkable

@runtime_checkable
class Sender(Protocol):
    def send(self, message: str) -> None: ...

isinstance(ConsoleSender(), Sender)   # True

Важно: runtime-проверка смотрит только на наличие методов с правильными именами, не на их сигнатуры. Объект с send(self) без аргументов пройдёт.

Generic Protocol

from typing import Protocol, TypeVar

T = TypeVar("T", covariant=True)

class Reader(Protocol[T]):
    def read(self) -> T: ...

class IntReader:
    def read(self) -> int:
        return 42

def consume(r: Reader[int]) -> int:
    return r.read() + 1

consume(IntReader())    # ok

Атрибуты в Protocol

class Named(Protocol):
    name: str         # обязателен как атрибут

class User:
    def __init__(self):
        self.name = "Ada"

def greet(x: Named) -> str:
    return f"Hello, {x.name}"

greet(User())     # ok

Если атрибут пишется через __init__ — runtime isinstance с @runtime_checkable может не увидеть его до создания инстанса.

Где Protocol полезен в реальной жизни

  • Dependency injection в FastAPI/тестах: зависимость объявлена как Protocol, в production подставляется реальный клиент, в тестах — fake.
  • Plugin-системы: сторонние модули реализуют контракт без импорта вашей библиотеки.
  • Совместимость со сторонним кодом: sqlalchemy, requests — нельзя поменять иерархию, но можно описать нужную "форму".
  • file-like / db-like объекты: вместо IO опишите свой SupportsRead.

Подводные камни

  • isinstance(obj, Protocol) без @runtime_checkable — TypeError.
  • Runtime-проверка игнорирует сигнатуры и аннотации параметров — pyright/mypy здесь строже.
  • Protocol с большим количеством методов — нарушение ISP, лучше разбить.
  • Унаследовать конкретный класс от Protocol — он становится «обязательным» (методы должны быть реализованы), и теряется смысл «structural».
  • В pydantic v1 поля + Protocol работали плохо; v2 лучше.
  • Не все методы Protocol должны быть ... — можно дать default implementation, но осторожно с диамондом.
  • На 3.7 и ниже Protocol требовал typing_extensions; на 3.8+ — в stdlib.

Частые вопросы на собеседовании

  • Что такое truthy и falsy значения в Python?
  • Когда использовать threading?
  • Что такое type hints и зачем они нужны?
  • Как работает yield?

Типичные ошибки

  • Не объяснять structural typing.
  • Использовать ABC там, где Protocol проще.
  • Писать огромные Protocol с десятками методов.

Что проверяет интервьюер

  • Понимает static duck typing.
  • Может показать dependency injection.
  • Отличает Protocol от ABC.

Как вы знаете этот вопрос?

Проверить себя по теме Python →

Источники

  • https://docs.python.org/3/library/typing.html

Связанные темы

PythonArchitecturetype-hints