首页 > 其他 > 详细

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

时间:2017-06-15 20:07:58      阅读:432      评论:0      收藏:0      [点我收藏+]

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

 

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

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

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!