我在Python3装饰器中遇到了一个非常奇怪的问题。
如果我这样做:
def rounds(nr_of_rounds):
def wrapper(func):
@wraps(func)
def inner(*args, **kwargs):
return nr_of_rounds
return inner
return wrapper
它工作得很好。但是,如果我这样做:
def rounds(nr_of_rounds):
def wrapper(func):
@wraps(func)
def inner(*args, **kwargs):
lst = []
while nr_of_rounds > 0:
lst.append(func(*args, **kwargs))
nr_of_rounds -= 1
return max(lst)
return inner
return wrapper
我得到了:
while nr_of_rounds > 0:
UnboundLocalError: local variable 'nr_of_rounds' referenced before assignment
换句话说,如果我在返回中使用nr_of_rounds
,我可以在内部函数中使用它,但我不能对它做其他任何事情。为什么会这样呢?
发布于 2015-04-26 03:12:00
目前还没有办法对封闭函数作用域中的变量执行相同的操作,但是Python3引入了一个新的关键字"nonlocal“,它的作用方式与全局相似,但用于嵌套函数作用域。
因此,在您的示例中,只需使用如下命令:
def inner(*args, **kwargs): nonlocal nr_of_rounds lst = [] while nr_of_rounds > 0: lst.append(func(*args, **kwargs)) nr_of_rounds -= 1 return max(lst) return inner
有关更多信息,请访问Short Description of the Scoping Rules?
https://stackoverflow.com/questions/29760593
复制相似问题