2017-03-09 151 views
1
some_global = 15 
. 
. 
. 
@some_decorator(some_global) 
def someFunction(): 
. 
. 
. 
class SomeClass: 
    def someMethod(self): 
     global some_global 
     some_global = 5 

在我的代码的上述抽象版本中,当全局方法运行后全局值传递到装饰器并且全局值发生变化时,参数仍然在装饰器中被识别为15,而不是5.这是一个已知的问题?或者必须是我的代码问题?全局函数装饰器

回答

1

这取决于您的代码行的顺序。如果我们的装饰器在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()