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

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

 

posted on 2017-06-15 19:37 Andy_963 阅读( ...) 评论( ...) 编辑 收藏

转载于:https://www.cnblogs.com/Andy963/p/7015824.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值