为分析程序内哪些函数执行时间开销较大,定义一个带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()
8.4【装饰器】实现属性可修改的函数装饰器
于 2023-04-18 13:29:02 首次发布