Задача на создание декоратора для функции

Условие задачи:

def transform(list1, list2):
  result = []
  for i in list1:
     for j in list2:
        result.append(f"{i} + {j}")
  return result

Cоздать декоратор, который, при применении его к вышеописанной функции, вернет список, получаемый при вызове transform(), но в обратном порядке (перевёрнутый список).

Вот мои попытки:

#исходная функция
def transform(list1,list2):
    result = []
    for i in list1:
        for j in list2:
            result.append(f'{i} + {j}')
    return result

Дальше идет моя попытка создать декоратор. Как можно заметить, я не дошел до того, чтобы задать ему какое-либо применение. Я попытался делать по аналогии с сайта, чтобы понять алгоритм, но что-то пошло не так. Я создал обертку чтобы мне было понятнее, как работает декоратор. Но в итоге я получал вот это [<function my_new_decorator..the_wrapper_around_the_original_function at 0x10cd4c940>] То есть результата как такового нет.

def my_new_decorator(transform):
     # Внутри себя декоратор определяет функцию-"обёртку". Она будет обёрнута вокруг декорируемой,
     # получая возможность исполнять произвольный код до и после неё.
     def the_wrapper_around_the_original_function():
         print("Я - код, который отработает до вызова функции")
         transform() # Сама функция
         print("А я - код, срабатывающий после")
     # Вернём эту функцию
     yield the_wrapper_around_the_original_function
a = my_new_decorator(transform([1,2,3,4,5],[6,7,8,9,10]))
print(list(a))

P.S. я новичок и плохо разбираюсь в этой теме, но очень хочу научиться. Буду признателен тем, кто откликнется.


Ответы (1 шт):

Автор решения: vp_arth
def rev(fn): # принимаем декорируемую функцию
    def inner(*args): # фактически вызываемая после декорирования функция
        return fn(*args)[::-1] # вызываем с теми же args, реверсим, возвращаем
    return inner

Применить для однократного вызова:

res = rev(transform)([1, 2, 3], [4, 5])

Или, на постоянной основе:

@rev
def transform(l1, l2):
    result = []
    # ...
→ Ссылка