python标准模块functools提供的wraps函数可以让被装饰器装饰以后的函数保留原有的函数信息,包括函数的名称和函数的注释doc信息。
函数被装饰以后,一些原本属于自己的自省信息会丢失,先来看装饰前的样子
def test(sleep_time):
"""
测试装饰器
:param sleep_time:
:return:
"""
time.sleep(sleep_time)
print(test.__name__)
print(test.__doc__)
执行输出结果
test
测试装饰器
:param sleep_time:
:return:
test是函数的名字,__doc__是函数的注释说明
但在被普通的装饰器装饰以后,这些信息就会丢失
import time
def cost(func):
def warpper(*args, **kwargs):
t1 = time.time()
res = func(*args, **kwargs)
t2 = time.time()
print(func.__name__ + "执行耗时" + str(t2-t1))
return res
return warpper
@cost
def test(sleep_time):
"""
测试装饰器
:param sleep_time:
:return:
"""
time.sleep(sleep_time)
print(test.__name__)
print(test.__doc__)
程序输出结果
warpper
None
这是我们所不希望看到的
wraps可以防止被装饰的函数丢失自己的自省信息,只需要增加@wraps(func)即可
import time
from functools import wraps
def cost(func):
@wraps(func)
def warpper(*args, **kwargs):
t1 = time.time()
res = func(*args, **kwargs)
t2 = time.time()
print(func.__name__ + "执行耗时" + str(t2-t1))
return res
return warpper
@cost
def test(sleep_time):
"""
测试装饰器
:param sleep_time:
:return:
"""
time.sleep(sleep_time)
print(test.__name__)
print(test.__doc__)
QQ交流群: 211426309