Задача на создание декоратора для функции
Условие задачи:
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 шт):
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 = []
# ...