Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带有多个参数的python修饰函数(Tornado)_Python_Arguments_Decorator_Tornado - Fatal编程技术网

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

带有多个参数的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

我已经写了一个decorator来验证调用。它只使用一个参数就可以正常工作,但如果使用更多参数,则触发
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)