国产跑车 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 微信小程序协议怎么写
  • ¥15 c语言怎么用printf(“\b \b”)与getch()实现黑框里写入与删除?
  • ¥20 怎么用dlib库的算法识别小麦病虫害
  • ¥15 华为ensp模拟器中S5700交换机在配置过程中老是反复重启
  • ¥15 java写代码遇到问题,求帮助
  • ¥15 uniapp uview http 如何实现统一的请求异常信息提示?
  • ¥15 有了解d3和topogram.js库的吗?有偿请教
  • ¥100 任意维数的K均值聚类
  • ¥15 stamps做sbas-insar,时序沉降图怎么画
  • ¥15 买了个传感器,根据商家发的代码和步骤使用但是代码报错了不会改,有没有人可以看看