为什么这个python装饰器不工作?
问题描述:
我想了解python中的装饰器。我不明白为什么下面不工作:为什么这个python装饰器不工作?
def decorator(func):
def logger(*args, **kwargs):
print "start logging"
func(*args, **kwargs)
print "end logging"
return logger
@decorator
def add(a,b):
return a+b
如果我打电话add(2,3)
输出将是:
start logging
end logging
但是如果我在logger
定义修改我的代码,写return func(*args, **kwargs)
它可以工作,但是end logging
没有写在输出上。
答
您可以捕获在变量的返回值,并打印后返回它:
def decorator(func):
def logger(*args, **kwargs):
print "start logging"
result = func(*args, **kwargs)
print "end logging"
return result
return logger
装饰都没有特殊的位置;它只是一个调用另一个函数的函数。
函数在你返回时结束......分配调用函数的结果,然后*打印*然后返回结果。 – jonrsharpe
'logger'函数*必须*返回'func'的值,但直到最后才能做到。现在想一下,你怎么可能保存'func'调用的结果,以后你可以'返回'? –