Напишите декоратор answer
, который преобразует функцию, принимающую неограниченное число позиционных и именованных параметров и возвращает её результат с припиской “Результат функции: <значение>”.
Примечание
Ваше решение должно содержать только функции.
В решении не должно быть вызовов требуемых функций.
Пример
Ввод
@answer
def a_plus_b(a, b):
return a + b
print(a_plus_b(3, 5))
print(a_plus_b(7, 9))
Вывод
Результат функции: 8
Результат функции: 16
Ввод
@answer
def get_letters(text: str) -> str:
return ''.join(sorted(set(filter(str.isalpha, text.lower()))))
print(get_letters('Hello, world!'))
print(get_letters('Декораторы это круто =)'))
Вывод
Результат функции: dehlorw
Результат функции: адекортуыэ
Решение
Первый подход к теме декораторы. Декораторы не сильно простая тема, в рамках хэндбука мы изучим только самые простые случаи применения декораторов.
Основная идея реализации декоратора в этих заданиях это создание функции, которая принимает в качестве параметра другую функцию (декорируемую) и проводит с ее результатами некоторые действия.
В задании нам надо к результату выдаваемому функцией приписать словосочетание “Результат функции:”.
Для начала давайте подумаем как бы мы эту задачу реализовали в лоб. Допустим, у нас есть функция simple_function(), которая возвращает строку. Как можно модифицировать эту строку дописав к ней что-то?
Например так:
def simple_function():
return 'Simple string'
def new_function(string):
return string + simple(function()
print(new_function('Дописываем строку: '))
А теперь самое сложное: в python можно записать в переменную ссылку на функцию, и потом обратившись к переменнокй как к функции вызвать функцию-оригинал:
def simple_function():
return 'Simple string'
temp_func = simple_function
print(temp_func())
Это позволяет сделать следующий шаг – передать функцию в качестве параметра в другую функцию:
def simple_function():
return 'Simple string'
def new_function(function, string):
return string + function()
temp_func = simple_function
print(new_function(temp_func, 'Дописываем строку: '))
Это уже почти то, что нам надо сделать для выполнения задания. Остается последний шаг – перенести нашу функцию обработчик в функцию-декоратор и сделать так, чтобы она могла передавать любое количество аргументов в декорируемую функцию.
Этот шаг не совсем очевиден, ведь с точки зрения python в конечном коде мы “теряем” аргументы, но не надо забывать, что декораторы прописываются в коде особым способом перед декорируемой функцией и в этом случае python прекрасно знает, что параметры нужно приберечь для вызова декорируемой (внутренней) функции.
Посмотреть код
Решение
def answer(func):
def code(*args, **kwargs):
return f'Результат функции: {func(*args, **kwargs)}'
return code