有这个代码:
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
如果你从inner
in 中取出一个变量的声明logger
,那么它将在 in和 in 中a
都可见。所以我把装饰器这个词放在引号里,因为装饰器是一种模式,问题是关于嵌套方法的范围。但是,该变量在方法中永远不可用,因为它是在自己的范围内执行的。logger
inner
nothing
a
对于嵌套函数,
inner
函数中声明的变量logger
在只读模式下可用。在这种情况下,关键字nonlocal
允许您将声明中的变量更改为上述范围。有趣的是,除非在代码中提及,否则没有
nonlocal
变量a
是不可见的。locals()
inner
但方法与它
nothing
无关。logger
inner