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

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日