首页 > 解决方案 > 当我使用带参数的python装饰器时,如何将参数传递给最里面的函数?

问题描述

当 func 返回不是 True 时,这是我的召回 func 装饰器

def deco_retry(retry_times):
    def _deco_retry(func):
        def wrapper(*args, **kwargs):
            while retry_times > 0:
                ret = func(*args, **kwargs)
                if ret:
                    return ret
                retry_times -= 1
        return wrapper
    return _deco_retry

@deco_retry(retry_times=1)
def func(ok=1):
    if ok == 1:
        return True
    else:
        return False

当我调用 func() 时,发生错误:

Traceback (most recent call last):
  File "E:/Charles/Code/pycharmprj/Huobi/test_code/decorator_test.py", line 26, in <module>
    func()
  File "E:/Charles/Code/pycharmprj/Huobi/test_code/decorator_test.py", line 10, in wrapper
    while retry_times > 0:
UnboundLocalError: local variable 'retry_times' referenced before assignment

为什么我不能retry_times在最里面的函数中引用:包装器,我该如何纠正这个错误?

标签: pythondecorator

解决方案


retry_times这是因为您稍后在函数中重新分配retry_times -= 1,因此使其成为局部变量。

nonlocal您可以在 while 循环上方添加(如果是 python3):

def _deco_retry(func):
    def wrapper(*args, **kwargs):
        nonlocal retry_times
        while retry_times > 0:

或者while,您可以尝试使用循环而不是使用循环range

def wrapper(*args, **kwargs):
    for _ in range(retry_times):
        ret = func(*args, **kwargs)
        if ret:
            return ret

应该工作相同,并且您不必乱加/减去重试次数。


推荐阅读