前提知识
高阶函数:一个函数可以作为参数传给另一个函数,或者一个函数的返回值为另一个函数(若返回值为该函数本身,则为递归),满足其一则为高阶函数。
常用高阶函数:map,filter,reduce等。
functools.wraps(wrapped[, assigned][, updated])
参数 assigned 的默认值对应于模块级常量 WRAPPER_ASSIGNMENTS (默认地将被包裹函数的 __name__, __module__ 和 __doc__ 属性赋给包裹函数)
Eg:
def decorator(func):
def wrapper(*args, **kwargs):
return func(*args, **kwargs)
return wrapper
@decorator
def add(x, y):
return x + y
add # <function __main__.wrapper>
可以看到被装饰的函数的名称,也就是函数的 __name__
属性变成了 wrapper
, 这就是装饰器带来的副作用,实际上add
函数整个变成了 decorator(add)
,而 wraps
装饰器能消除这些副作用:
def decorator(func):
@wraps(func)
def wrapper(*args, **kwargs):
return func(*args, **kwargs)
return wrapper
@decorator
def add(x, y):
return x + y
add # <function __main__.add>
会更正的属性定义在 WRAPPER_ASSIGNMENTS
中:
>>> functools.WRAPPER_ASSIGNMENTS
('__module__', '__name__', '__doc__')
>>> functools.WRAPPER_UPDATES
('__dict__',)
refer to:
https://blog.windrunner.me/python/functools.html
https://www.cnblogs.com/qingyuanjushi/p/8396032.html