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

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

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

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

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

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

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

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

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

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

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

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

Все подборки
  • Python7 042
  • Облачные технологии5 085
  • QA вакансии1 814
  • Android1 199
  • Инженер данных831
  • Продакт-менеджер339

Разработка

  • iOS1 135
  • Backend вакансии1 131
  • Fullstack вакансии475
  • AI вакансии458
  • Frontend вакансии404
  • Mobile вакансии27

По стеку

  • Go4 093
  • Java2 435
  • Kotlin990
  • Node.js827
  • Rust665
  • .NET525
  • PHP282
  • C++223
  • C#199

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

  • Kubernetes2 931
  • Linux-инфраструктура2 312
  • DevOps вакансии2 110
  • Terraform / IaC1 714
  • CI/CD872
  • Мониторинг и Observability825
  • SRE253
  • Кибербезопасность50

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

  • Аналитик данных497
  • Data Scientist463
  • Бизнес-аналитик374
  • Системный аналитик54

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

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

По регионам

  • Вакансии в США25 531
  • Вакансии в Европе9 792
  • Работа в России3 193
  • Вакансии в Канаде2 236

По формату

  • Удалённые вакансии43 578
  • Релокация в США25 531
  • Гибридная работа4 289
  • Офисная работа3 340

По уровню

  • Senior вакансии21 650
  • Middle вакансии12 211
  • Junior вакансии3 886

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

Все компании
  • Rakuten188 вакансий
  • ASML163 вакансии
  • Grab134 вакансии
  • Wise125 вакансий
  • Celonis28 вакансий
  • Infobip28 вакансий
  • Spotify24 вакансии
  • Adyen17 вакансий
  • Darktrace17 вакансий
  • Monzo13 вакансий

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

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

Как написать декоратор, который принимает аргументы?

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

Это трёхуровневая конструкция: внешняя функция-фабрика принимает параметры и возвращает настоящий декоратор; декоратор принимает функцию и возвращает wrapper. @retry(times=3) сначала вызывает retry(times=3), результат применяется к функции.

Три уровня

Декоратор с аргументами — это не декоратор, а фабрика декораторов. Когда вы пишете @retry(times=3), Python сначала вычисляет retry(times=3) (получает реальный декоратор), а потом применяет его к функции:

@retry(times=3)
def f(): ...

# эквивалентно
decorator = retry(times=3)
f = decorator(f)

Готовый пример

from functools import wraps
import time, logging

log = logging.getLogger(__name__)

def retry(times: int = 3, delay: float = 0.5, exceptions: tuple = (Exception,)):
    def decorator(func):
        @wraps(func)
        def wrapper(*args, **kwargs):
            last_exc = None
            for attempt in range(1, times + 1):
                try:
                    return func(*args, **kwargs)
                except exceptions as exc:
                    last_exc = exc
                    log.warning("attempt %d/%d failed: %s", attempt, times, exc)
                    time.sleep(delay * attempt)
            raise last_exc
        return wrapper
    return decorator

@retry(times=3, delay=0.2, exceptions=(ConnectionError,))
def fetch(url): ...

Поддержка обоих вариантов (@deco и @deco(...))

Иногда хочется, чтобы декоратор работал и без скобок, и со скобками. Шаблон:

from functools import wraps

def cache(func=None, *, maxsize: int = 128):
    if func is None:
        # вызвали @cache(maxsize=...)
        def decorator(f):
            return cache(f, maxsize=maxsize)
        return decorator
    # вызвали @cache без скобок
    storage = {}
    @wraps(func)
    def wrapper(*args, **kwargs):
        key = (args, tuple(sorted(kwargs.items())))
        if key not in storage:
            if len(storage) >= maxsize:
                storage.pop(next(iter(storage)))
            storage[key] = func(*args, **kwargs)
        return storage[key]
    return wrapper

@cache                         # без скобок
def f(x): return x * 2

@cache(maxsize=256)            # со скобками
def g(x): return x * 2

Класс как фабрика

class Retry:
    def __init__(self, times: int = 3):
        self.times = times

    def __call__(self, func):
        @wraps(func)
        def wrapper(*args, **kwargs):
            for _ in range(self.times):
                try:
                    return func(*args, **kwargs)
                except Exception:
                    continue
            raise
        return wrapper

@Retry(times=5)
def get(): ...

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

  • Забыть скобки: @retry вместо @retry() — Python вызовет retry(f), передав функцию вместо параметров.
  • Параметры фабрики и аргументы wrapper живут в разных замыканиях — не путайте.
  • Mutable default argument на фабрике (exceptions=[Exception]) — те же грабли, что и у обычных функций.
  • Параметры — позиционные, а вызывающий передал именованные — TypeError в момент импорта, что трудно поймать на этапе CI.
  • Без @wraps метаданные исходной функции теряются.

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

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

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

  • Писать только двухуровневый декоратор.
  • Возвращать wrapper из внешней функции напрямую.
  • Не понимать порядок вызовов при импорте.

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

  • Объясняет три уровня функций.
  • Показывает замыкание с параметром.
  • Знает эквивалент decorator = repeat(3).

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

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

Источники

  • https://docs.python.org/3/library/functions.html
  • https://docs.python.org/3/reference/executionmodel.html

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

Pythonfunctional-programmingwrappers