Skip to main content
 首页 » 编程设计

python之为在当前范围之外实现的 Python 函数定义变量

2025年05月04日20telwanggs

我想知道为什么下面的工作:

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”。

装饰器用另一个函数替换一个函数。通常,提供参数不是装饰器的工作,除非您尝试使用默认参数。参数来自调用函数的代码。