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()