装饰器的内部函数无法访问装饰器变量

时间:2020-01-16 05:55:45

标签: python recursion exception decorator

我有以下代码

from time import sleep
def dec(my_func,*args,**kwargs):
     counter = 0
     def temp_func(*args, **kwargs):
         try:
             my_func(*args,**kwargs)
             return True
         except:
             if counter < 5:
                 counter+=1
                 temp_func(*args, **kwargs)
                 sleep(10)
             else:
                 return False
     return temp_func
@dec
def my_func(a,b):
    return a/b

print(my_func(1,2))
print(my_func(1,0))

它引发以下错误。

---------------------------------------------------------------------------
UnboundLocalError                         Traceback (most recent call last)
<ipython-input-11-f73a2a9ab2e3> in <module>()
----> 1 my_func(1,0)

<ipython-input-8-bce781eec53d> in temp_func(*args, **kwargs)
      7             return True
      8         except:
----> 9             if counter < 5:
     10                 counter+=1
     11                 temp_func(*args, **kwargs)

UnboundLocalError: local variable 'counter' referenced before assignment

为什么内部函数不能在这里访问装饰变量?通常,内部函数可以访问装饰变量。即使我在全局上下文中设置计数器变量,我也会遇到相同的错误。我在这里想念什么吗?

1 个答案:

答案 0 :(得分:0)

我不完全确定为什么会发生此错误,但是如果将counter移至temp_func而不是dec,那么它将起作用。它应该具有相同的效果。