我是学习python的新手,使用装饰器时遇到了一个陈旧的问题。我无法从@ decorate1打印结果。如果您能帮助我解决问题,将非常感谢。请在下面找到代码:
def decorate1(function):
def wrapper(*args):
print("the arguments are ",args)
return wrapper
def fileoperation(function):
def wrapper():
f=function()
with open("sample.txt",'w') as wf:
wf.write(f)
return wrapper
def listoperation(function):
def wrapper(*args):
mylst=[]
for i in args:
mylst.append(i)
print(mylst)
return wrapper
@listoperation
@decorate1
def display(name,age):
pass
display('vijay',31)
@fileoperation
def filestring():
return "This is a file"
filestring()
Output:
['vijay', 31]
[Finished in 0.2s]
答案 0 :(得分:0)
您的代码存在的问题是您的装饰器未返回包装的函数。
我将举一个例子,排除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]