Вступ до декораторів
Свайпніть щоб показати меню
Декоратор у Python — це функція вищого порядку, яка приймає іншу функцію як аргумент і повертає нову функцію, що розширює або змінює поведінку оригінальної функції.
Декоратори — це ключова особливість Python, яка дозволяє змінювати або розширювати поведінку функцій чи методів без прямого редагування їхнього коду. По суті, декоратори — це функції вищого порядку: вони приймають іншу функцію як аргумент, розширюють або змінюють її поведінку та повертають нову функцію. У Python для застосування декоратора використовується символ @, за яким вказується ім'я декоратора, розміщене безпосередньо над визначенням функції.
Поширені випадки використання декораторів:
- Логування;
- Вимірювання часу виконання функцій;
- Контроль доступу або перевірка дозволів;
- Мемоізація (кешування результатів);
- Валідація вхідних даних.
Декоратори дозволяють відокремити таку логіку від основної бізнес-логіки, що сприяє чистішому та легшому для підтримки коду. Опановуючи декоратори, ви отримуєте потужний інструмент для написання багаторазового та виразного коду на Python.
12345678910111213def simple_decorator(func): def wrapper(*args, **kwargs): print("Before the function call") result = func(*args, **kwargs) print("After the function call") return result return wrapper @simple_decorator def greet(name): print(f"Hello, {name}!") greet("Alice")
Розуміння args та kwargs у визначеннях функцій
Під час написання декораторів і обгорток часто виникає потреба обробляти функції, які приймають будь-яку кількість або тип аргументів. Python надає *args та **kwargs для цього.
*argsзбирає всі додаткові позиційні аргументи, передані у функцію, у кортеж;**kwargsзбирає всі додаткові іменовані аргументи у словник.
Ця гнучкість є ключовою для декораторів. Декоратор повинен мати змогу приймати та передавати всі аргументи оригінальній функції, незалежно від їх кількості та типу. Без *args та **kwargs ваш декоратор працюватиме лише з функціями з фіксованим підписом, що обмежує повторне використання.
123456789101112def my_decorator(func): def wrapper(*args, **kwargs): print("Arguments:", args) print("Keyword arguments:", kwargs) return func(*args, **kwargs) return wrapper @my_decorator def example(a, b, greeting="Hello"): print(f"{greeting}, {a} and {b}!") example(1, 2, greeting="Hi")
Такий підхід гарантує, що ваш декоратор може обгортати будь-яку функцію, роблячи код надійним і багаторазово використовуваним.
1. Яке призначення символу @ у Python?
2. Як декоратор змінює поведінку функції?
Дякуємо за ваш відгук!
Запитати АІ
Запитати АІ
Запитайте про що завгодно або спробуйте одне із запропонованих запитань, щоб почати наш чат