【发布时间】:2015-08-18 19:54:23
【问题描述】:
我有一个类正在运行检查,每个函数都执行一个检查。我曾想过给装饰器添加额外的条件,但这可能并不明智。
我理解装饰器的概念,每个装饰器都将其装饰的函数作为输入,然后将装饰的函数返回给下一个。例如,这对于返回字符串的函数来说效果很好,因为输出可以很容易地被装饰器编辑并返回到下一个装饰器。
我想要做的是修改函数属性,例如设置一个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本身。你真正的真正问题是什么? -
感谢您的回答;我的问题是我不能同时设置
authenticated标志和分配order。我编辑了我的问题,以便更清楚 -
恐怕我不明白你的
auth_required装饰器应该如何工作??? -
我在别处对用户进行身份验证,并用身份验证结果填充此装饰器参数:
True表示允许,False表示禁止。 -
我仍然不明白它应该如何工作,抱歉。你定义和应用
auth_require()的方式,你的装饰函数变成check_authentication(f)。这个函数的作用是: 1. 检查is_authenticated是否为真——这将永远为真,因为在这个阶段is_authenticated是原始函数(你用auth_required()装饰的那个)并且function对象有一个布尔上下文中的真值 -,然后 2. 返回它的参数f。这显然不是你所期望的,是吗???