首页 > 代码库 > 在函数被装饰的情况下如何取消装饰器,访问原始函数
在函数被装饰的情况下如何取消装饰器,访问原始函数
在函数被装饰器装饰的情况下,需要保持原始函数的文档,帮助信息等信息,或者直接调用原始函数,此时需要引入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!
在函数被装饰的情况下如何取消装饰器,访问原始函数
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。