Логотип YeaHub

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

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

Тренажёр

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

Обучение

Навыки

Задачи

Войти

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

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

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про Python: decorator, args, kwargs, Python, function wrapper

Как передавать позиционные и именованные аргументы через декоратор?

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

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

Для передачи аргументов через декоратор используется внутренняя функция-обертка, которая принимает *args и **kwargs. Это позволяет декоратору обрабатывать любые позиционные и именованные аргументы, переданные декорируемой функции. Внутри обертки эти аргументы передаются в исходную функцию с помощью распаковки.

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

Основы передачи аргументов через декоратор

Декоратор в Python — это функция, которая принимает другую функцию и возвращает ее модифицированную версию. Чтобы декоратор мог работать с любыми аргументами, внутренняя функция-обертка должна использовать *args и **kwargs. Это позволяет перехватывать все позиционные и именованные аргументы, переданные декорируемой функции, и передавать их дальше.

Пример реализации

Рассмотрим простой декоратор, который логирует вызов функции:

def logger(func):
    def wrapper(*args, **kwargs):
        print(f"Вызов {func.__name__} с args={args}, kwargs={kwargs}")
        return func(*args, **kwargs)
    return wrapper

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

greet("Анна")
greet("Иван", greeting="Здравствуйте")

В этом примере декоратор logger перехватывает все аргументы, выводит их в консоль и передает в исходную функцию greet. Без *args и **kwargs декоратор не смог бы обработать произвольное количество аргументов.

Применение на практике

Такой подход широко используется для создания декораторов, которые добавляют логирование, проверку прав доступа, кэширование или замер времени выполнения. Например, декоратор для измерения времени работы функции:

import time

def timer(func):
    def wrapper(*args, **kwargs):
        start = time.time()
        result = func(*args, **kwargs)
        end = time.time()
        print(f"{func.__name__} выполнилась за {end - start:.4f} сек")
        return result
    return wrapper

@timer
def compute(n):
    return sum(range(n))

compute(1000000)

Вывод

Использование *args и **kwargs в декораторах делает их универсальными и применимыми к любым функциям, независимо от их сигнатуры. Это ключевой паттерн для создания переиспользуемых оберток в Python.

  • Аватар

    Python Guru

    Sergey Filichkin

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

Уровень

  • Рейтинг:

    4

  • Сложность:

    5

Навыки

  • Python

    Python

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

#decorator

#args

#kwargs

#Python

#function wrapper

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

  • Аватар

    Python Guru

    Sergey Filichkin

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