Вебинары Разобраться в IT Реферальная программа
Программирование Аналитика Дизайн Маркетинг
ПРИХОДИТЕ УЧИТЬСЯ НОВОЙ ПРОФЕССИИ ЛЕТОМ СО СКИДКОЙ ДО 70% Забронировать скидку
07 Июл 2023
2 мин
2573

Что такое functools.wraps в Python?

В Python декораторы — это способ изменения поведения функции или класса, они оборачивают функцию или класс, чтобы добавить новые функциональности.

Освойте Python на курсе от Skypro. Вас ждут 400 часов обучения и практики (достаточно десяти часов в неделю), подготовка проектов для портфолио, индивидуальная проверка домашних заданий и помощь опытных наставников. Получится, даже если у вас нет опыта в IT.

В Python декораторы — это способ изменения поведения функции или класса, они оборачивают функцию или класс, чтобы добавить новые функциональности. Например, с помощью декоратора можно добавить поведение для логирования в функцию, не изменяя саму функцию.

Пример декоратора:

def log_decorator(func):
    def wrapper():
        print(f'Вызов функции: {func.__name__}')
        func()
    return wrapper

@log_decorator
def hello_world():
    print("Hello, world!")

hello_world()

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

print(hello_world.__name__)
# Вывод: wrapper

Здесь вместо ожидаемого hello_world выводится wrapper. Это происходит потому, что hello_world теперь ссылается на функцию wrapper внутри log_decorator.

Вот здесь на помощь приходит functools.wraps. Это функция в Python, которая используется внутри декоратора перед внутренней обертывающей функцией. Она обновляет обертку для функции, чтобы она включала в себя имя декорируемой функции и ее документацию.

Вот пример использования functools.wraps:

from functools import wraps

def log_decorator(func):
    @wraps(func)
    def wrapper():
        print(f'Вызов функции: {func.__name__}')
        func()
    return wrapper

@log_decorator
def hello_world():
    print("Hello, world!")

print(hello_world.__name__)
# Вывод: hello_world

Теперь, когда мы печатаем hello_world.__name__, мы получаем ожидаемое имя функции, даже если она была декорирована. Это делает functools.wraps очень полезным при работе с декораторами в Python.

Изучайте Python на онлайн-курсе от Skypro «Python-разработчик». Программа рассчитана на новичков без опыта программирования и технического образования. Курс проходит в формате записанных коротких видеолекций. Будет много проверочных заданий и мастер-классов. В конце каждой недели — живая встреча с экспертами в разработке для ответов на вопросы и разбора домашек.

Добавить комментарий

Подарок
Забрать подарок