← Назад ко всем вопросам

Декоратор, который будет писать имя функции до ее вызова

1️⃣ Как кратко ответить

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

2️⃣ Подробное объяснение темы

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

Пример декоратора, который выводит имя функции перед её вызовом

def print_function_name_decorator(func):
    """
    Декоратор, который выводит имя функции перед её вызовом.
    ​
    :param func: функция, которую нужно обернуть
    :return: обёрнутая функция с дополнительной функциональностью
    """
    def wrapper(*args, **kwargs):
        # Выводим имя функции, используя атрибут __name__
        print(f"Calling function: {func.__name__}")
        # Вызываем оригинальную функцию с переданными аргументами и возвращаем её результат
        return func(*args, **kwargs)
    ​
    # Возвращаем обёрнутую функцию
    return wrapper
​
# Пример использования декоратора
@print_function_name_decorator
def example_function():
    """
    Пример функции, которая ничего не делает.
    """
    print("Function is running.")
​
# Вызов функции
example_function()

Объяснение кода

  1. Определение декоратора:

    • print_function_name_decorator — это функция-декоратор, которая принимает функцию func в качестве аргумента.
    • Внутри декоратора определяется функция wrapper, которая оборачивает оригинальную функцию.
  2. Функция-обёртка wrapper:

    • print(f"Calling function: {func.__name__}") — выводит имя функции перед её вызовом. func.__name__ — это атрибут, который содержит имя функции.
    • return func(*args, **kwargs) — вызывает оригинальную функцию с переданными аргументами и возвращает её результат. *args и **kwargs позволяют передавать произвольное количество позиционных и именованных аргументов.
  3. Возврат обёрнутой функции:

    • Декоратор возвращает функцию wrapper, которая теперь содержит дополнительную функциональность — вывод имени функции перед её вызовом.
  4. Применение декоратора:

    • @print_function_name_decorator — это синтаксический сахар, который применяется перед определением функции example_function. Он автоматически оборачивает example_function в wrapper.
  5. Вызов функции:

    • При вызове example_function() сначала выполняется код в wrapper, который выводит имя функции, а затем вызывает оригинальную example_function.

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

Тема: Python
Стадия: Tech

🔒 Подпишись на бусти автора и стань Алигатором, чтобы получить полный доступ к функционалу сайта и отслеживать свой прогресс!

Твои заметки