gpt4 book ai didi

带参数的 Python 装饰器只调用一次

转载 作者:太空狗 更新时间:2023-10-30 02:30:21 26 4
gpt4 key购买 nike

请考虑以下简化示例:

permitted = True
class is_allowed(object):
def __init__(self, some_arg):
# this is actually needed in the complete code
self.some_arg = some_arg

def __call__(self, f):
if permitted == False:
raise Exception("not authenticated to do that")
def wrapped_f(*args, **kwargs):
f(*args, **kwargs)
return wrapped_f

@is_allowed("blah")
def print_hi():
print("hi")

print_hi()
permitted = False
print_hi()

我猜问题是装饰器只在函数 print_hi() 被定义时被调用一次。因此,全局变量的更改无效。有什么办法可以避免这种行为?

最佳答案

将支票移到 wrapped_f

def __call__(self, f):
def wrapped_f(*args, **kwargs):
if not permitted:
raise Exception("not authenticated to do that")
f(*args, **kwargs)
return wrapped_f

wrapped_f 之外,它在创建 函数时进行检查。在内部,它成为新可调用主体的一部分,这意味着每次调用时都会检查它。

您想意识到 wrapped_f 将被调用而不是 print_hi,因此您希望任何应该包含在函数中的行为都进入其中。

关于带参数的 Python 装饰器只调用一次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27575954/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com