Синтаксис
Декоратор працює, приймаючи функцію як аргумент, а потім виконуючи її у обгортці функції wrapper.
Для застосування декоратора використовується символ @, за яким слідує ім'я функції-декоратора, розміщене безпосередньо над функцією, яку потрібно модифікувати. Ось приклад:
def decorator(func):
...
# Перший спосіб
@decorator
add(a,b):
print(f "Функція додавання: {a} + {b}")
add(2, 3)
# Другий спосіб
add(a,b):
print(f "Функція додавання: {a} + {b}")
inner = decorator(add)
inner(2, 3)
У цьому прикладі обидва методи дають однаковий результат. Перший спосіб, з використанням символу @, є більш читабельним і лаконічним способом застосування декораторів, які часто називають "синтаксичним цукром".
Типовим є використання вкладеної функції з назвою wrapper всередині декораторів.
Гнучкі декоратори: Пристосування до різноманітних аргументів функцій
Функції часто вимагають різної кількості аргументів.
Для розробки декоратора, який можна застосовувати до функцій з різною кількістю аргументів, ефективно використовувати *args та **kwargs у функції wrapper().
1234567891011121314151617181920212223242526272829303132333435def indicate(func): def wrapper(*args, **kwargs): print("=" * 15) print("Taken arguments:", *args, kwargs) result = func(*args, **kwargs) print("=" * 15) return result return wrapper @indicate def avg_two(a, b): '''Calculate the average of two numbers''' return round((a + b) / 2, 1) @indicate def avg_three(a, b, c): '''Calculate the average of three numbers''' return round((a + b + c) / 3, 1) @indicate def avg_many_kwargs(**kwargs): '''Calculate the average of multiple numbers in a dictionary''' keys = 0 total = 0 for value in kwargs.values(): keys += 1 total += value return round(total / keys, 1) print("Returned:", avg_two(14, 21), "\n") print("Returned:", avg_three(225, 12, 11), "\n") print("Returned:", avg_many_kwargs(first=51, second=11, third=47, fourth=93))
Дякуємо за ваш відгук!
Запитати АІ
Запитати АІ
Запитайте про що завгодно або спробуйте одне із запропонованих запитань, щоб почати наш чат
Can you explain how *args and **kwargs work in decorators?
What happens if I use the decorator on a function with no arguments?
Can you show how to remove the decorator from a function?
Чудово!
Completion показник покращився до 3.7
Синтаксис
Свайпніть щоб показати меню
Декоратор працює, приймаючи функцію як аргумент, а потім виконуючи її у обгортці функції wrapper.
Для застосування декоратора використовується символ @, за яким слідує ім'я функції-декоратора, розміщене безпосередньо над функцією, яку потрібно модифікувати. Ось приклад:
def decorator(func):
...
# Перший спосіб
@decorator
add(a,b):
print(f "Функція додавання: {a} + {b}")
add(2, 3)
# Другий спосіб
add(a,b):
print(f "Функція додавання: {a} + {b}")
inner = decorator(add)
inner(2, 3)
У цьому прикладі обидва методи дають однаковий результат. Перший спосіб, з використанням символу @, є більш читабельним і лаконічним способом застосування декораторів, які часто називають "синтаксичним цукром".
Типовим є використання вкладеної функції з назвою wrapper всередині декораторів.
Гнучкі декоратори: Пристосування до різноманітних аргументів функцій
Функції часто вимагають різної кількості аргументів.
Для розробки декоратора, який можна застосовувати до функцій з різною кількістю аргументів, ефективно використовувати *args та **kwargs у функції wrapper().
1234567891011121314151617181920212223242526272829303132333435def indicate(func): def wrapper(*args, **kwargs): print("=" * 15) print("Taken arguments:", *args, kwargs) result = func(*args, **kwargs) print("=" * 15) return result return wrapper @indicate def avg_two(a, b): '''Calculate the average of two numbers''' return round((a + b) / 2, 1) @indicate def avg_three(a, b, c): '''Calculate the average of three numbers''' return round((a + b + c) / 3, 1) @indicate def avg_many_kwargs(**kwargs): '''Calculate the average of multiple numbers in a dictionary''' keys = 0 total = 0 for value in kwargs.values(): keys += 1 total += value return round(total / keys, 1) print("Returned:", avg_two(14, 21), "\n") print("Returned:", avg_three(225, 12, 11), "\n") print("Returned:", avg_many_kwargs(first=51, second=11, third=47, fourth=93))
Дякуємо за ваш відгук!