在函数被装饰器装饰的情况下,需要保持原始函数的文档,帮助信息等信息,或者直接调用原始函数,此时需要引入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(" Origin index function: ") 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(" Origin index function: ") 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!