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

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

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

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

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

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

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

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

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

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

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

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

Все подборки
  • Python9 813
  • Облачные технологии9 649
  • QA вакансии2 810
  • Android1 398
  • Инженер данных1 068
  • Продакт-менеджер414

Разработка

  • iOS1 305
  • Backend вакансии1 280
  • AI вакансии569
  • Fullstack вакансии543
  • Frontend вакансии450
  • Mobile вакансии27

По стеку

  • Go5 484
  • Java3 453
  • Node.js1 146
  • Kotlin1 133
  • Rust883
  • .NET837
  • PHP383
  • C++327
  • C#261

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

  • Kubernetes5 503
  • Linux-инфраструктура4 223
  • Terraform / IaC3 059
  • DevOps вакансии2 970
  • Мониторинг и Observability1 414
  • CI/CD1 240
  • SRE411
  • Кибербезопасность61

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

  • Аналитик данных612
  • Бизнес-аналитик572
  • Data Scientist528
  • Системный аналитик69

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

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

По регионам

  • Вакансии в США30 650
  • Вакансии в Европе12 551
  • Работа в России3 510
  • Вакансии в Канаде2 658

По формату

  • Удалённые вакансии48 186
  • Релокация в США30 650
  • Гибридная работа7 410
  • Офисная работа5 407

По уровню

  • Senior вакансии26 826
  • Middle вакансии12 754
  • Junior вакансии4 519

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

Все компании
  • Rakuten189 вакансий
  • ASML163 вакансии
  • Grab134 вакансии
  • Wise134 вакансии
  • Celonis30 вакансий
  • Infobip28 вакансий
  • Spotify24 вакансии
  • Adyen19 вакансий
  • Darktrace17 вакансий
  • Monzo13 вакансий

Вакансии из 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