Декоратор функции в Python
Изучаю тему с декораторами, есть задание. Условие: Объявите функцию с именем get_sq , которая вычисляет площадь прямоугольника по двум параметрам: width и height – ширина и высота прямоугольника и возвращает результат. Определите декоратор для этой функции с именем (внешней функции) func_show , который отображает результат на экране в виде строки (без кавычек): "Площадь прямоугольника: <значение>". Вызовите декорированную функцию get_sq.
Составил код, вроде бы все работает, но не уверен в правильности, т.к. цикл будет перебирать все аргументы, а не именно два: width и height. Хотел бы узнать, как можно оформить именно для двух аргументов. И правильно ли вызван декоратор? Буду признателен за объяснения и советы. Спасибо.
def func_show(func):
def get_sq(**kwargs):
x = 1
for v in kwargs.values():
x *= int(v)
func(x)
return get_sq
@func_show
def result(kwargs):
print(f"Площадь прямоугольника: {kwargs}")
if __name__ == '__main__':
result(width=4, height=6)
Ответы (2 шт):
скорее всего нужно вот так:
def get_sq(width, height):
return width * height
def func_show(func):
def decor(width, height):
print(f"площадь прямоугольника: {func(width, height)}")
return decor
get_sq = func_show(get_sq)
get_sq(4, 6)
если есть желание сохранить вывод как у первоначальной функции:
def get_sq(width, height):
return width * height
def func_show(func):
def decor(width, height):
square = func(width, height)
print(f"площадь прямоугольника: {square}")
return square
return decor
get_sq = func_show(get_sq)
res = get_sq(4, 6)
Ваш код в принципе не будет работать - декоратор пустой, return get_sq вне функции, да и к чему перебор аргументов, если по заданию у вас их два... Давайте подробнее разберем как надо
def func_show(func): # это наша функция декоратор
# внутри декоратора у нас будет функция-обработчик, который и будет декорировать оригинальную функцию
# На вход этой функции примем те же аргументы что и оригинальная функция
def wrapper(width, height):
res = func(width, height) # обратимся к оригинальной функции для получения результата
print(f"Площадь прямоугольника: {res}") # выведем текст в соответствии с заданием
return res # и в конце вернем вычисленное значение (вдруг за декоратором кто-то им воспользоваться хотел)
return wrapper # результат работы декоратора - вызов нашей функции-обработчика
# соственно декорирование вашей функции, вычисления площади
@func_show
def get_sq(width, height):
return width*height
if __name__ == '__main__':
# вызов декорированной функции
get_sq(width=4, height=6)