我有一个类运行检查,每个函数执行检查。我曾想过装饰者添加额外的条件,但这可能不是明智的。多个python装饰器检索原函数
我理解装饰器的概念,每个装饰器都以输入装饰它的功能,并返回下一个装饰的功能。例如,对于返回字符串的函数,这很好,因为输出可以很容易地由装饰器编辑并返回到下一个装饰器。
我想要做的就是修改函数属性,把例如一个don't exec
标志检查,不再运行,require auth
仅当验证已经获得,或改变功能属性order
,测序检查启动进行检查。
# I return f only if is_authenticated flag is True
def auth_required(is_authenticated):
def check_authentication(f):
if is_authenticated:
return f
return check_authentication
# I edit order variable
def assignOrder(order):
def do_assignment(f):
f.order = order
return f
return do_assignment
# I instanciate Checks class and provide authentication;
# login and password will be tried and is_authenticat flag set accordingly
c = Checks(target, login, password)
# I sort on order variable and launch checks
functions = sorted(
[
getattr(c, field) for field in dir(c)
if hasattr(getattr(c, field), 'order')
],key = (lambda field : field.order)
)
for function in functions:
function()
# I assign decorators so that order variable is set
# I would like auth_required triggers launch if auth is performed
@auth_required(True)
@assignOrder(100)
def check_shares(self):
# check defined here
这对assignOrder很有效,我的检查按正确顺序启动。
但@auth_required
适用于assignOrder
这不是我想要的。
有没有办法检索要装饰的原始功能?或者装饰者的用法在这种情况下是不相关的?那么解决方案是什么?
非常感谢
“但@auth_required应用于assignOrder,这不是我想要的。” 实际上,'auth_required'应用于“什么'assignOrder'返回”,而不是'assignOrder'本身。这里你的_real_问题实际上是什么? –
感谢您的回答;我的问题是我不能设置一个'认证'标志并在同一时间分配一个'订单'。我编辑我的问题,使其更清晰 – philippe
恐怕我不明白你的'auth_required'装饰器应该如何工作? –