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

+1 128новых вакансий за сутки·93 813вакансий открыто сейчас·Новое:Talanto осенью: фильтры с числами, отклик по шагам и каталог компаний

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

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

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

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

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

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

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

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

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

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

Все подборки
  • Python17 196
  • Облачные технологии14 160
  • QA вакансии3 451
  • Backend вакансии2 107
  • Инженер данных1 800
  • Продакт-менеджер1 247

Разработка

  • Android1 855
  • iOS1 695
  • Fullstack вакансии995
  • AI вакансии952
  • Frontend вакансии751
  • Mobile вакансии43

По стеку

  • Go8 754
  • Java6 595
  • Node.js2 038
  • .NET1 738
  • Kotlin1 617
  • Rust1 473
  • C#718
  • PHP692
  • C++582

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

  • Kubernetes7 778
  • DevOps вакансии6 088
  • Linux-инфраструктура5 502
  • Terraform / IaC4 276
  • CI/CD3 275
  • Мониторинг и Observability1 793
  • SRE563
  • Кибербезопасность453

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

  • Data Scientist1 141
  • Бизнес-аналитик921
  • Аналитик данных860
  • Системный аналитик154

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

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

По регионам

  • Вакансии в США44 164
  • Вакансии в Европе24 016
  • Вакансии в Канаде4 533
  • Работа в России3 837

По формату

  • Удалённые вакансии75 134
  • Релокация в США44 163
  • Гибридная работа12 456
  • Офисная работа7 066

По уровню

  • Senior вакансии42 633
  • Middle вакансии20 971
  • Junior вакансии6 706

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

Все компании
  • Rakuten189 вакансий
  • Wise189 вакансий
  • ASML166 вакансий
  • Grab137 вакансий
  • Celonis38 вакансий
  • Spotify37 вакансий
  • Adyen28 вакансий
  • Infobip28 вакансий
  • Monzo20 вакансий
  • Darktrace17 вакансий

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

Вакансии с этим навыком

Python вакансии
  • Internship - Machine Learning and image-based EUV system setup
  • Internship-Optical Modeling and Simulation Engineering
  • Engineering Manager, Copilot
  • Test Engineer - Electric Propulsion, Satellites (Starlink)
  • Ingeniero de Machine Learning & Modelado