国产跑车 2022-01-16 11:45 采纳率: 0%
浏览 18

python 有参装饰器,装饰器参数无法被调用

我想编写一个控制程序调用频率的装饰器
def timer(step,duration):
    def wrapper(func):
        last_time = time.time()
        def inner(*args, **kwargs):
            global last_time
            global duration
            while duration >= 0:
                current_time = time.time()
                if current_time - last_time > step:
                    func(*args, **kwargs)
                    last_time = current_time
                    duration -= 1
                else:
                    pass
        return inner
    return wrapper

@timer(100, 10)
def func(x):
    x -= 1
    print(x)
    return x

func(100)

NameError: name 'duration' is not defined
试过将duration这个参数定义为全局变量,可还是无法调用
请问这是什么原因造成的,怎么解决?以后我该如何避免类似故障发生。
  • 写回答

1条回答 默认 最新

  • 陈年椰子 2022-01-16 18:02
    关注

    按你的逻辑,改了一下

    def timer(*dargs, **dkargs):
        def wrapper(func):
            def _wrapper(*args, **kwargs):
                if 'step' in dkargs and 'duration' in dkargs:
                    duration = dkargs['duration']
                    step = dkargs['step']
                    last_time = time.time()
                    # print(step,duration)
                    while duration >= 0:
                        current_time = time.time()
                        # print(step, duration,current_time - last_time)
                        if current_time - last_time > step:
                            func(*args, **kwargs)
                            last_time = current_time
                            duration -= 1
                        else:
                            pass
                return func(*args, **kwargs)
            return _wrapper
        return wrapper
    
    #100 秒太久了, 我改成1秒跑一下,好看效果
    @timer(step= 1, duration = 10)
    def func(x):
        x -= 1
        print(x)
        return x
    
    
    评论

报告相同问题?

问题事件

  • 创建了问题 1月16日

悬赏问题

  • ¥15 x趋于0时tanx-sinx极限可以拆开算吗
  • ¥500 把面具戴到人脸上,请大家贡献智慧
  • ¥15 任意一个散点图自己下载其js脚本文件并做成独立的案例页面,不要作在线的,要离线状态。
  • ¥15 各位 帮我看看如何写代码,打出来的图形要和如下图呈现的一样,急
  • ¥30 c#打开word开启修订并实时显示批注
  • ¥15 如何解决ldsc的这条报错/index error
  • ¥15 VS2022+WDK驱动开发环境
  • ¥30 关于#java#的问题,请各位专家解答!
  • ¥30 vue+element根据数据循环生成多个table,如何实现最后一列 平均分合并
  • ¥20 pcf8563时钟芯片不启振