全局函数装饰器

Global in function decorator

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

在我的代码的上述抽象版本中,当方法已经 运行 并且全局值更改后将全局传递到装饰器时,装饰器中仍将参数识别为 15 ,而不是 5。这是一个已知问题吗?或者一定是我的代码有问题?

这取决于代码行的顺序。如果我们的装饰器在 some 方法之前调用一个参数,那么 some_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()