wraps
其实之前我们看到过,打印被修饰的函数名的时候发现已经不是自己了就是因为,@wrapper 其实就相当于func=wrapper(func) 在全局命名空间中,func已经不是原来定义的func函数了,而是装饰器函数内部的一个闭包函数inner 因为func是wrapper函数的返回值了,原来的func函数已经作为参数传递给wrapper函数的f参数了!
def wrapper(f): def inner(*args,**kwargs): ret=f(*args,**kwargs) return ret return inner @wrapper def func(a,b): print(a,b) return "哈哈哈" print(func(1,2)) print(func.__name__)
运行结果:
其实我们可以借助functools中的wraps 是别人写好的装饰器函数,我们直接拿来用,效果就是可以使得加上装饰器扩充了功能的func函数变得看起来跟之前的调用一样啦:
from functools import wraps def wrapper(f): @wraps(f) #在装饰器函数内部的闭包函数上方加上@wraps(被装饰的函数名) def inner(*args,**kwargs): ret=f(*args,**kwargs) return ret return inner @wrapper def func(a,b): print(a,b) return "哈哈哈" print(func(1,2)) print(func.__name__)
运行结果: