Логотип YeaHub

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

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

Тренажёр

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

Обучение

Навыки

Задачи

Войти

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

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

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

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

Как декоратор работает на уровне функций?

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

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

Декоратор — это функция, которая принимает другую функцию и возвращает новую функцию, изменяя или расширяя её поведение. Когда мы пишем @decorator, Python подменяет исходную функцию на результат вызова декоратора. Внутри обычно создаётся "обёртка" (wrapper), которая вызывает исходную функцию и добавляет новые действия: логирование, проверку, кеширование и т.п. Таким образом, декоратор позволяет модифицировать поведение без изменения исходного кода.

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

1. Что такое декоратор на уровне механики

Определение:
Декоратор — это функция высшего порядка, которая принимает функцию и возвращает новую функцию, обычно оборачивающую оригинальную.

То есть:

  • вход: функция f;

  • выход: функция wrapper, которая выполняет дополнительные шаги и вызывает f.

1.1. Как работает синтаксис @decorator

Когда Python видит:

@decorator
def func():
    pass

Это равносильно:

def func():
    pass

func = decorator(func)

То есть:

  • исходная функция создаётся;

  • передаётся декоратору;

  • заменяется на версию, которую вернул декоратор.

1.2. Простой пример внутренней логики

Python

def decorator(func):
    def wrapper(*args, **kwargs):
        print("before")
        result = func(*args, **kwargs)
        print("after")
        return result
    return wrapper

Если применить:

Python

@decorator
def hello():
    print("hello")

То реальное выполнение:

  • вызов hello() → вызов wrapper(), который затем вызывает оригинальный hello.

1.3. Особенность: сохранение метаданных функции

Без дополнительных действий:

  • имя hello станет wrapper;

  • докстрока потеряется.

Поэтому часто используют:

Python

from functools import wraps

def decorator(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        return func(*args, **kwargs)
    return wrapper

Это сохраняет __name__, __doc__, сигнатуру.

1.4. Для чего используют декораторы

  • логирование;

  • тайминг;

  • кеширование (functools.lru_cache);

  • аутентификация и авторизация (Flask, FastAPI);

  • транзакции (SQLAlchemy);

  • валидация данных.

Краткий вывод

Декоратор принимает функцию, создаёт вокруг неё обёртку и возвращает её обратно. Это мощный инструмент модификации поведения без изменения исходного кода.

  • Аватар

    Python Guru

    Sergey Filichkin

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

Уровень

  • Рейтинг:

    5

  • Сложность:

    5

Навыки

  • Python

    Python

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

#decorator

#wrapper

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

  • Аватар

    Python Guru

    Sergey Filichkin

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