D. Декор результата

Напишите декоратор 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(), которая возвращает строку. Как можно модифицировать эту строку дописав к ней что-то?

Например так:

Python
def simple_function():
    return 'Simple string'
    
def new_function(string):
    return string + simple(function()
    
print(new_function('Дописываем строку: '))

А теперь самое сложное: в python можно записать в переменную ссылку на функцию, и потом обратившись к переменнокй как к функции вызвать функцию-оригинал:

Python
def simple_function():
    return 'Simple string'
    
temp_func = simple_function

print(temp_func())

Это позволяет сделать следующий шаг – передать функцию в качестве параметра в другую функцию:

Python
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 прекрасно знает, что параметры нужно приберечь для вызова декорируемой (внутренней) функции.

Посмотреть код

Решение

Python
def answer(func):
    def code(*args, **kwargs):
        return f'Результат функции: {func(*args, **kwargs)}'
    return code
Подписаться
Уведомить о
guest
0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии