<p>我有一个类在运行检查,每个函数执行一个检查。我曾想过给装修师增加额外的条件,但这也许不明智。在</p>
<p>我理解decorators的概念,每个函数都将它所装饰的函数作为输入,然后返回到下一个装饰的函数。例如,对于返回字符串的函数来说,这是非常有效的,因为decorator可以很容易地编辑输出并返回给下一个decorator。在</p>
<p>我要做的是修改函数属性,例如,将<code>don't exec</code>标志用于不运行检查,<code>require auth</code>用于仅在授予身份验证时执行的检查,或者将函数属性<code>order</code>更改为序列检查启动。在</p>
<pre><code># 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
</code></pre>
<p>这对assignOrder很有效,我的支票是按正确的顺序启动的。在</p>
<p>但是<code>@auth_required</code>应用于<code>assignOrder</code>,这不是我想要的。在</p>
<p>有没有一种方法可以检索要修饰的原始函数?或者decorator的用法与本案无关?怎么解决呢?在</p>
<p>非常感谢</p>