我想知道为什么下面的工作:
def wrapper():
def wrap(p=10):
def f():
print(p)
f()
return wrap
f2 = wrapper()
f2()
但这不是:
def f():
print(p)
def enhance(f):
def wrap(p=10):
f()
return wrap
f2 = enhance(f)
f2() # NameError: name 'p' is not defined
有没有办法修改第二种情况,以便定义变量 p?我在玩函数装饰器,但无法弄清楚如何将变量公开给我传递给装饰器的函数。
请您参考如下方法:
我想我明白你真正想问的是什么。您正在考虑装饰器,而不是可变范围。你说你不知道如何“将变量暴露给我传递给装饰器的函数”。在您的案例 2 中,您传递给 enhance 的函数没有任何变量(参数)。假设我们给它一个参数,像这样:
def f(p):
print(p)
def enhance(f):
def wrap(p=10):
f(p) # pass the argument to f
return wrap
f2 = enhance(f)
f2()
现在你有了一个名为enhance 的函数,它可以用作装饰器。被装饰的函数接受一个参数。装饰器将用一个新函数替换此函数,该函数可以用一个或零个参数调用。如果不带参数调用,它将获得默认值“10”。
装饰器用另一个函数替换一个函数。通常,提供参数不是装饰器的工作,除非您尝试使用默认参数。参数来自调用函数的代码。
