带多个参数的python装饰函数(Tornado)

2024-05-15 22:23:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我已经写了一个装饰器来验证电话。它只对一个参数有效,但对更多参数则不行,触发inner() takes exactly 1 argument (2 given)。我有一点回叫意大利面,因为我使用龙卷风,但我不确定什么是最好的方法来做这个。在

#this works
class FirstHandler(BaseHandler):

    @asynchronous
    @oauth_machine.auth
    def post(self):
        print self.user
        self.finish()

#this now also does
class SecondHandler(BaseHandler):

    @asynchronous
    @oauth_machine.auth
    def get(self, args):
        self.write("ok")
        self.finish()

装饰函数

^{pr2}$

编辑:

已将代码更新为工作版本。在

谢谢!在


Tags: selfauth参数def装饰machinethisoauth
1条回答
网友
1楼 · 发布于 2024-05-15 22:23:46

一开始我以为问题很简单,但后来你发布了一个与原始错误信息相矛盾的回溯。然而,我认为问题仍然很简单,假设回溯错误是正确的。回想一下:

@decorator
def foo(x):
    return x + 1

只是语法上的甜言蜜语:

^{pr2}$

因此,当您在get上使用@oauth_machine.auth时,它将通过一个闭包传递到inner,作为fn。在

def auth(fn):
    def inner(self):
        res = get_user_by_credentials(self, fn, callback=done_auth)
    return inner

然后它被传递到get_user_by_credentials,又称为fn,这又产生另一个闭包,它将fn传递给callback。在

def get_user_by_credentials(self, fn, callback):

    def onFetchUserCredentials(result, error):
        self.user = result
        callback(self, fn)

callbackinner中被定义为done_auth,因此{}(即原始的get)的菜单被传递到那里,然后在^{上调用:

def done_auth(result, fn):
    return fn(result)

但是fn(即get)有两个参数。你只传递了一个,导致了一个错误。在

相关问题 更多 >