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这个参数定义为全局变量,可还是无法调用
请问这是什么原因造成的,怎么解决?以后我该如何避免类似故障发生。

按你的逻辑,改了一下

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