• 在函数被装饰的情况下如何取消装饰器,访问原始函数


    在函数被装饰器装饰的情况下,需要保持原始函数的文档,帮助信息等信息,或者直接调用原始函数,此时需要引入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!
    
  • 相关阅读:
    windows 系列机器查看tcp 配置
    test windows live writer
    win7 mysql 启动 问题
    用enum枚举量做下标初始化数组
    二层VXLAN静态配置
    pip install scrapy报错原文
    python练习2
    pycharm字体大小设置快捷键的方法
    python练习1
    centos 7下修改IP地址为静态
  • 原文地址:https://www.cnblogs.com/Andy963/p/7015824.html
Copyright © 2020-2023  润新知