【python进阶教程】深入理解python装饰器,实现属性可修改的函数装饰器
文章目录
实现属性可修改的函数装饰器
解决方案: 新添加一个函数作为包裹函数的属性,在他的内部修改闭包中使用的变量 nonlocal 访问嵌套作用域中的变量和引用
统计被装饰器函数单次调用运行时间
时间大于参数timeout的,将此次函数调用记录到log中
运行时可修改timeout的值
import time
import logging
def warn(timeout):
def decorator(func):
def wrapper(*args, **kargs):
start = time.time()
res = func(*args, **kargs)
used = time.time() - start
if used > timeout:
msg = f'{func.__name__}: {used} > {timeout}'
logging.warn(msg)
return res
def setTimeout(k): # 把这个函数作为wrapper 的属性
nonlocal timeout # nonlocal timeout # 访问嵌套作用域中的变量和引用 生成一个嵌套作用域的变量
timeout = 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()