Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про Python: decorator, function arguments, wrapper, higher-order function, Python

Как передаются аргументы в декоратор?

Вопрос проверяет понимание механизма передачи аргументов в декораторы Python, что необходимо для создания гибких и переиспользуемых обёрток функций.

Короткий ответ

Аргументы в декоратор передаются на двух уровнях. Сам декоратор может принимать аргументы, если он реализован как функция, возвращающая декоратор. Затем, когда декорируемая функция вызывается, её собственные аргументы передаются во внутреннюю функцию-обёртку, созданную декоратором. Декоратор получает функцию как аргумент, а обёртка получает аргументы вызова.

Длинный ответ

Декоратор в Python — это функция, которая принимает другую функцию в качестве аргумента и возвращает новую функцию, обычно добавляя какую-то логику. Передача аргументов происходит в два этапа: сначала аргументы могут быть переданы самому декоратору (если он параметризован), а затем аргументы передаются в декорируемую функцию при её вызове.

Базовый декоратор без аргументов

Простейший декоратор принимает только один аргумент — саму декорируемую функцию. Аргументы же вызова этой функции передаются во внутреннюю функцию-обёртку (wrapper).

def my_decorator(func):
    def wrapper(*args, **kwargs):
        print("До вызова функции")
        result = func(*args, **kwargs)
        print("После вызова функции")
        return result
    return wrapper

@my_decorator
def greet(name):
    print(f"Привет, {name}!")

greet("Анна")  # Аргумент "Анна" передаётся в wrapper

Декоратор с аргументами

Чтобы декоратор сам принимал аргументы, нужна дополнительная "обёртка". Создаётся функция, которая принимает аргументы декоратора и возвращает собственно декоратор, который уже принимает функцию. Это позволяет параметризовать поведение декоратора.

def repeat(times):
    # times — аргумент декоратора
    def decorator(func):
        # func — декорируемая функция
        def wrapper(*args, **kwargs):
            # *args, **kwargs — аргументы вызова функции
            for _ in range(times):
                result = func(*args, **kwargs)
            return result
        return wrapper
    return decorator

@repeat(times=3)
def say_hello():
    print("Hello!")

say_hello()  # Выведет "Hello!" три раза

Как это работает

  • При использовании @repeat(times=3) сначала вызывается repeat(3), который возвращает функцию decorator.
  • Затем этот decorator применяется к функции say_hello, принимая её как аргумент.
  • В итоге возвращается wrapper, который при вызове будет выполнять say_hello указанное количество раз.

Практическое применение

Декораторы с аргументами часто используются для настройки логирования, кэширования, проверки прав доступа или повторных попыток (retry). Например, декоратор для кэша может принимать время жизни кэша в секундах.

Вывод: Передача аргументов в декоратор позволяет создавать гибкие и переиспользуемые компоненты. Используйте декораторы с аргументами, когда нужно параметризовать их поведение, а простые декораторы — для стандартной обёртки логики вокруг функций.

  • Аватар

    Python Guru

    Sergey Filichkin

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.

Уровень

  • Рейтинг:

    4

  • Сложность:

    5

Навыки

  • Python

    Python

Ключевые слова

#decorator

#function arguments

#wrapper

#higher-order function

#Python

Подпишись на Python Developer в телеграм

  • Аватар

    Python Guru

    Sergey Filichkin

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.