修改带参数装饰器实现方式

一、根据用户传递的参数,动态修改装饰器的入参

二、实例:

import time,logging,random
def timeout(t):
def outter(func):
def inner(*args, **kwargs):
t0 = time.time()
res = func(*args, **kwargs)
t1 = time.time()
used = t1 - t0
if used >= t:
logging.error("{}:{}>{}".format(func.__name__, used, t))
return res
    # 修改装饰器参数方法
def set_timeout(new_timeout):
nonlocal t
t = new_timeout
    # 将set_timeout函数地址赋值给inner的属性set_timeout,以便能使用inner.set_timeout()进行调用:f.set_timeout(1)
inner.set_timeout = set_timeout
return inner
return outter


@timeout(1.5)
def f(i):
print("in f [{}]".format(i))
while random.randint(0, 1):
time.sleep(0.6)


f.set_timeout(1)
for x in range(1):
f(x)
posted @ 2021-06-02 16:47  只管去做-王炸  阅读(125)  评论(0)    收藏  举报