在函数被装饰器装饰的情况下,需要保持原始函数的文档,帮助信息等信息,或者直接调用原始函数,此时需要引入wraps模块
#!/usr/bin/env python
#coding:utf-8
#@Author:Andy
# Date: 2017/6/14
import time
from random import randrange
# 装饰器
def timer(func):
"""
Measure function's running time
"""
def wrapper(*args, **kwargs):
start_time = time.time()
func(*args, **kwargs)
stop_time = time.time()
print("Run time is %s" % (stop_time - start_time))
return wrapper
@timer
# 被装饰函数
def index(n:int):
time.sleep(randrange(1, 5))
print("I was decorated!")
if __name__ == '__main__':
index(5)
print("function name:",index.__name__)
print("doc:",index.__doc__)
print("annotations:", index.__annotations__)
print("\nOrigin index function:\n")
origin_index = index.__wrapped__
#AttributeError: 'function' object has no attribute '__wrapped__'
#origin_index(10)
上面因为没有引入wraps ,会出现attribueError错误,引入wraps后:
import time
from random import randrange
from functools import wraps
# 装饰器
def timer(func):
"""
Measure function's running time
"""
@wraps(func)
def wrapper(*args, **kwargs):
start_time = time.time()
func(*args, **kwargs)
stop_time = time.time()
print("Run time is %s" % (stop_time - start_time))
return wrapper
@timer
# 被装饰函数
def index(n:int):
"""
Decorated function
"""
time.sleep(randrange(1, 3))
print("I was decorated!")
if __name__ == '__main__':
index(5)
print("function name:",index.__name__)
print("doc:",index.__doc__)
print("annotations:", index.__annotations__)
print("\nOrigin index function:\n")
origin_index = index.__wrapped__
origin_index(10)
结果:
I was decorated!
Run time is 2.0009963512420654
function name: index
doc:
Decorated function
annotations: {'n': <class 'int'>}
Origin index function:
I was decorated!