You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改带参数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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 19:27:04