全局函数装饰器
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()
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()