Проблема с вашим кодом в том, что ваш декоратор не возвращает упакованную функцию.
Я приведу пример, исключая функцию filestring()
, поскольку это та же ошибка.
def decorate1(function):
def wrapper(*args, **kwargs):
print("the arguments are ",args)
function(*args, **kwargs)
return wrapper
def listoperation(function):
def wrapper(*args, **kwargs):
mylst=[]
for i in args:
mylst.append(i)
print(mylst)
function(*args, **kwargs)
return wrapper
@listoperation
@decorate1
def display(name,age):
pass
display('vijay',31)
Как вы можете видеть, некоторые пункты в ваших функциях изменились:
- Даже если для примера это не нужно, безопаснее всегда создавать оболочку, принимающую и пересылающую
*args, **kwargs
, поэтому любой аргументв любой переданной форме будет перенаправлен в упакованную функцию - Оболочка должна вызывать упакованную функцию со всеми ее параметрами: в противном случае «упакованная» функция не будет выполнена!
ОБЩИЙ ПРИМЕР:
Иногда пример может помочь «обернуть» ваш ум вокруг декораторов.
Допустим, вам нужна функция, которая печатаетпервые N
натуральные числа:
def my_numbers(N):
return list(range(N))
Затем вы замечаете, что эта функция, как и многие другие, иногда дает сбой.У вас есть подозрение, что кто-то передает аргументы, которые вы не ожидаете, поэтому вы хотите напечатать, какой аргумент передается, и вывод функции, не вмешиваясь в функцию.
Вы пишете декоратор, но так как всефункции принимают разное количество аргументов и аргументов ключ-значение, вы оставляете это общим:
def my_logger(f):
def wrapper(*args, **kwargs):
print("Someone has passed these arguments: {0}".format(*args))
res = f(*args, **kwargs)
print("With the values that someone passed, I got the following output: {0}".format(res))
return res
return wrapper
И после оформления нашей функции:
@my_logger
def my_numbers(N):
return list(range(N))
Мы получаем следующий вывод:
Кто-то передал эти аргументы: 4
Со значениями, которые кто-то передал, я получил следующий вывод: [0, 1, 2, 3]
[0, 1, 2, 3]