全球功能装饰器


some_global = 15
. 
. 
. 
@some_decorator(some_global)
def someFunction(): 
. 
. 
. 
class SomeClass:
    def someMethod(self):
        global some_global
        some_global = 5

在我的代码的上述抽象版本中,当全局运行后,全局被传递到装饰器中,并且全局更改的值,该参数仍然在装饰器中识别为15,而不是5这是一个已知的问题?还是我的代码必须是一个问题?

这取决于代码行的顺序。如果我们的装饰器在某种方法之前用参数调用,则某些_global具有其初始值,否则如果您在装饰器之前调用某些方法,则全局变量具有更改的值。

使用此代码:

some_global = 15

def some_decorator(val):
    print("decorator val: {}".format(val))
    print("decorator global: {}".format(some_global))
    def real_decorator(function):
        def wrapper():
            function()
        return wrapper
    return real_decorator

class SomeClass:
    def some_method(self):
        global some_global
        some_global = 5
        print("method: {}".format(some_global))

如果您写

@some_decorator(some_global)
def some_function():
    print("function: {}".format(some_global))

SomeClass().some_method()
some_function()

然后输出将为

decorator val: 15
decorator global: 15
method: 5
function: 5

但输出此代码:

SomeClass().some_method()

@some_decorator(some_global)
def some_function():
    print("function: {}".format(some_global))

some_function()

将是:

method: 5
decorator val: 5
decorator global: 5
function: 5

我强烈建议您不使用全局变量。

在您的情况下,您可以将其直接在装饰器的包装纸中使用:

some_global = 15

def real_decorator(function):
    print("decorator: {}".format(some_global))
    def wrapper():
        print("wrapper: {}".format(some_global))
        function()
    return wrapper

class SomeClass:
    def some_method(self):
        global some_global
        some_global = 5
        print("method: {}".format(some_global))

@real_decorator
def some_function():
    print("function: {}".format(some_global))

SomeClass().some_method()
some_function()

在此代码中,包装器中的变量值仅取决于代码底部的函数调用顺序,并且等于其在某些函数中的值:

SomeClass().some_method()
some_function()

相关内容

  • 没有找到相关文章

最新更新