Skip to main content
 首页 » 编程设计

Python装饰器函数作用域

2025年05月04日17yxwkf

我似乎无法弄清楚为什么下面的代码没有将 demovar 暴露给装饰函数:

def exposebasevar(function): 
    def decorator(*args, **kwargs): 
        demovar = 'Where am I?' # => or MyThreadSafeObjectHandle() 
        return function(*args, **kwargs) 
    return decorator 
 
@exposebasevar 
def usesexposedvariable(): 
    print demovar # this line will give an error 
 
usesexposedvariable() 

背景:我有一个模块,其中包含一个全局变量,用于每个函数。 现在我想让那个线程安全,所以我想通过装饰器使这个 var 可用。然后在装饰器中,我可以找出对象的哪个实例属于线程并将其传递进去。这样我就不需要更改每个函数的签名或内容。

有人知道怎么设置吗?谢谢。

请您参考如下方法:

那将是动态范围。广泛认为这是一个非常糟糕的想法,因此在包括 Python 在内的多种语言中根本不支持。只是不可能,除非你想使用非常肮脏和脆弱的技巧。我实际上将此作为标准免责声明包括在内,并不是因为我有任何此类解决方案。我能提供的最接近“工作”的方法是重写字节码,呃。

相反,将其作为修饰函数的参数。或者摆脱全局批发,从长远来看,这可能会更简单、更好。

def exposebasevar(function): 
    def decorator(*args, **kwargs): 
        demovar = 'Where am I?' 
        return function(*args, demovar=demovar, **kwargs)  # << 
    return decorator 
 
@exposebasevar 
def usesexposedvariable(demovar):  # << 
    print demovar