有这个代码:
def logger(f):
def inner(*args, **kwargs):
a = 6
return f(*args, **kwargs)
return inner
@logger
def nothing():
print(a)
有一个错误是变量a未定义,我不太明白他在作用域中是根据什么原理来查找的。你可以解释吗?
有这个代码:
def logger(f):
def inner(*args, **kwargs):
a = 6
return f(*args, **kwargs)
return inner
@logger
def nothing():
print(a)
有一个错误是变量a未定义,我不太明白他在作用域中是根据什么原理来查找的。你可以解释吗?
“装饰器”与任何其他方法具有相同的范围。在这种情况下,变量
a在方法中声明inner并且仅在其中可见。a如果你从innerin 中取出一个变量的声明logger,那么它将在 in和 in 中a都可见。所以我把装饰器这个词放在引号里,因为装饰器是一种模式,问题是关于嵌套方法的范围。但是,该变量在方法中永远不可用,因为它是在自己的范围内执行的。loggerinnernothinga对于嵌套函数,
inner函数中声明的变量logger在只读模式下可用。在这种情况下,关键字nonlocal允许您将声明中的变量更改为上述范围。有趣的是,除非在代码中提及,否则没有
nonlocal变量a是不可见的。locals()inner但方法与它
nothing无关。loggerinner