码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2017-06-15 20:27:40      阅读:172      评论:0      收藏:0      [点我收藏+]

标签:ret   env   wrapper   bsp   from   div   **kwargs   ted   error:   

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

 

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

标签:ret   env   wrapper   bsp   from   div   **kwargs   ted   error:   

原文地址:http://www.cnblogs.com/Andy963/p/7015824.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!