2013-05-09 46 views
1

我有以下裝飾和類。裝飾者args和kwargs在元組內返回

def auth(fn): 

    def check_headers(self): 
     print 'checking headers...' 
     #self.headers work done here 

    def inner(self, *args, **kwargs): 
     check_headers(self) 
     fn(self, args, kwargs) 

    return inner 

class Worker(object): 

    @auth 
    def work(self, *args, **kwargs): 
     print 'auth passed' 
     print args 
     print kwargs 


worker_obj = Worker() 
worker_obj.work('arg', kw='kwarg') 

,輸出:

> checking headers... 
> auth passed 
> (('arg',), {'kw': 'kwarg'}) 
> {} 

但我在期待這樣的:

> checking headers... 
> auth passed 
> ('arg',) 
> {'kw': 'kwarg'} 

怎麼來的ARGS/kwargs越來越放在一個元組時,原來的方法(工() )正在運行,後期裝修?

我知道,剝離下來到

def auth(fn): 
    return fn 

正確返回的參數,但我需要在返回前做的工人實例(個體經營)一些工作。我肯定錯過了裝飾者的一些東西。

謝謝!

回答

3

當你調用fn(self, args, kwargs),你傳遞兩個位置參數:中args元組,和kwargs的字典。所以如果您撥打work(1, x=2),您將撥打func(self, (1,), {'x': 2})。爲擴大原著指定參數和kwargs到單獨的參數,你需要做的

fn(self, *args, **kwargs) 

這將意味着當你調用work(1, x=2),那麼你也將調用fn(self, 1, x=2)

你可以看到關於這個here的文檔。

+0

太棒了,太快了!謝謝。 – 2013-05-09 19:23:20

2

因爲你把kwargs而不是**kwargs

def inner(self, *args, **kwargs): 
    check_headers(self) 
    fn(self, *args, **kwargs) 
+0

哇...這很容易。謝謝:) – 2013-05-09 19:23:00

+0

@abarnert true。 – CppLearner 2013-05-09 19:24:50