8.4【装饰器】实现属性可修改的函数装饰器

为分析程序内哪些函数执行时间开销较大,定义一个带timeout参数的函数装饰器。功能:
1.统计被装饰函数单词调用运行时间
2.时间大于参数timeout的,将此次函数调用记录到log日志中
3.运行时可修改timeout的值

#
为包裹函数增添一个函数,用来修改闭包中使用的自由变量。在py3中:使用nonlocal访问嵌套作用域中的变量引用
from functools import wraps
def warn(timeout): # 带参数的装饰器,内部返回一个装饰器
	def decorator(func): # 内部真正的函数装饰器,接收一个函数
		def wrapper(*args, **kargs): # 定义包裹函数
			pass
		return wrapper
	return decorator

import time
import logging
def warn(timeout):
	timeout = [timeout]
	def decorator(func): 
		def wrapper(*args, **kargs): 
			start = time.time()
			res = func(*args, **kargs)
			used = time.time() - start
			# if used > timeout: #py3
			if used >timeout[0]:
				#msg = '"%s": %s > %s' % (func.__name__, used, timeout) # py3
				msg = '"%s": %s > %s' % (func.__name__, used, timeout[0])
				logging.warn(msg)
			return res
		def setTimeout(k):
			# nonlocal timeout # py3
			# timeout = k # py3
			timeout[0] = k
		wrapper.setTimeout = setTimeout
		return wrapper
	return decorator

from random import randint
@warn(1.5)
def test():
	print('In test')
	while randint(0,1):
		time.sleep(0.5)
for _ in range(30):
	test()
test.setTimeout(1)
for _ in range(30):
	test()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值