带有多个参数的python修饰函数(Tornado)
我已经写了一个decorator来验证调用。它只使用一个参数就可以正常工作,但如果使用更多参数,则触发带有多个参数的python修饰函数(Tornado),python,arguments,decorator,tornado,Python,Arguments,Decorator,Tornado,我已经写了一个decorator来验证调用。它只使用一个参数就可以正常工作,但如果使用更多参数,则触发internal()只需要1个参数(给定2个)。因为我用的是Tornado,所以我吃了一点意大利面,但我不确定最好的方法是什么 #this works class FirstHandler(BaseHandler): @asynchronous @oauth_machine.auth def post(self): print self.user
internal()只需要1个参数(给定2个)
。因为我用的是Tornado,所以我吃了一点意大利面,但我不确定最好的方法是什么
#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()
修饰函数
编辑:
已将代码更新为工作版本
谢谢 我起初以为问题很简单,但后来你发布了一个与原始错误消息相矛盾的回溯。但是,假设回溯错误是正确的,我认为问题仍然非常简单。回顾这一点:
@decorator
def foo(x):
return x + 1
这是一个简单的语法糖:
def foo(x):
return x + 1
foo = oauth_machine.auth(foo)
因此,当您在get
上使用@oauth\u machine.auth
时,它通过一个闭包传递到内部作为fn
def auth(fn):
def inner(self):
res = get_user_by_credentials(self, fn, callback=done_auth)
return inner
然后将其作为fn
传递到get\u user\u-by\u-credentials
,从而生成另一个闭包,该闭包将fn
传递到回调
def get_user_by_credentials(self, fn, callback):
def onFetchUserCredentials(result, error):
self.user = result
callback(self, fn)
callback
定义为done\u auth
返回internal
,以便fn
(即原始get
)的菜单传递到那里,然后调用结果
:
def done_auth(result, fn):
return fn(result)
但是fn
(即get
)接受两个参数。您只传递一个,从而导致错误 将def-internal(self):
更改为def-internal(*args):
和print args
以查看传入的参数。我在函数中传入了两个args。通过将self
更改为args[0]
,我仍然得到一个get()正好包含2个参数(给定1个)
。我在哪里不传递第二个参数?您没有任何调用get
的代码。假设你已经发布了所有相关的代码,这意味着是Tornado中的某个东西在不正确地调用你的get
,这可能意味着你在Tornado中调用的东西不正确。发布堆栈跟踪以便我们可以看到。@abarnert,它在文章的第一部分,在SecondHandler
中,它覆盖了http get。当从url匹配regexp时,它会被触发。我可以看到它的定义位置,但它是如何被调用的?“当regexp与url匹配时”是不够的;堆叠痕迹是什么?嘿,谢谢你的解剖!在此期间,我让它工作了(更新了代码),你完全正确-get()在经过decorator后被触发,但done_auth()缺少一个参数。我不得不把它从一个结尾弹到另一个结尾。干杯
def done_auth(result, fn):
return fn(result)