如何修改带参数Python装饰器实现函数调用次数统计并传值
可计数自动清零的Python装饰器实现
核心修改逻辑:
- 在外层包装函数
wrapper_external中初始化调用计数器,利用闭包特性保证每个被装饰函数的计数独立 - 内层包装函数中使用
nonlocal关键字声明要修改的外层计数器变量 - 先累计计数、保存当前调用次数,再判断是否达到阈值清零,确保传递给原函数的
new_time是本次调用的真实计数
修改后完整代码:
import functools def change_time(_func=None, *, time=None): # 未指定time阈值时默认设为999,也可根据需求调整默认值或抛出异常 time = 999 if time is None else time def wrapper_external(func): # 为每个被装饰函数初始化独立计数器 how_many_times_func_called = 0 @functools.wraps(func) def wrapper_internal(*args, **kwargs): nonlocal how_many_times_func_called # 累计调用次数 how_many_times_func_called += 1 # 保存当前计数 current_count = how_many_times_func_called # 达到阈值则清零计数器 if current_count >= time: how_many_times_func_called = 0 # 将当前计数作为new_time参数传给原函数 return func(*args, **kwargs, new_time=current_count) return wrapper_internal if _func is None: return wrapper_external else: return wrapper_external(_func) @change_time(time=3) def my_func(some_text, new_time): some_text += 'abc' some_text += f': {new_time}' return some_text # 测试输出 print(my_func('blabla')) # 输出:blablaabc: 1 print(my_func('blabla')) # 输出:blablaabc: 2 print(my_func('blabla')) # 输出:blablaabc: 3 print(my_func('blabla')) # 输出:blablaabc: 1 print(my_func('blabla')) # 输出:blablaabc: 2
内容的提问来源于stack exchange,提问作者Niewasz Biznes
相关产品推荐
相关产品推荐

