回顾Python装饰器使用
from functools import wraps
def dec(f):
def wrapper(*args, **kwargs):
'wrapper doc'
print('wrapper')
return f(*args, **kwargs)
return wrapper
@dec
def add(x, y):
'original add'
return x + y
print(add(3,3))
print(add)
print(add.__name__)
print(add.__doc__)
输出结果:
wrapper
6
<function dec.<locals>.wrapper at 0x7fd3b6bed0d0>
wrapper
wrapper doc
发现函数add
经过装饰器(wrapper)之后函数的属性发生变化如函数名和__doc__
,这不是期望的结果。
wraps解决函数签名问题
Python提供了functools
来解决该问题,代码如下:
from functools import wraps
def dec(f):
@wraps(f)
def wrapper(*args, **kwargs):
'wrapper doc'
print('wrapper')
return f(*args, **kwargs)
return wrapper
@dec
def add(x, y):
'original add'
return x + y
print(add(3,3))
print(add)
print(add.__name__)
print(add.__doc__)
输出结果:
wrapper
6
<function add at 0x7fb18832c0d0>
add
original add
发现经过装饰之后的函数属性跟装饰之前的函数一样。
如何获取装饰之前的函数
当需要获取装饰之前的函数相关性质时,Python也提供了类似的功能,可以使用__wrapped__
属性。
print(add.__wrapped__)
print(add.__wrapped__.__doc__)
print(add.__wrapped__.__name__)
网友评论