2013-10-22 22 views
0

我正在使用webapp2,瀏覽了它的源代碼後,我仍然不知道*args**kwargs參數是如何傳遞給RequestHandler對象的。當在webapp2和Python中實例化RequestHandler對象時,誰通過* args和** kwargs參數?

我在看這個樣子的(實際的完整代碼源是從課程建設者,可以發現here)的代碼示例:

class ApplicationHandler(webapp2.RequestHandler): 
    def __init__(self, *args, **kwargs): 
     super(ApplicationHandler, self).__init__(*args, **kwargs) 

有沒有辦法知道這些來了從和如何調試它們?

+0

可能重複[\ * args和\ * \ * kwargs?](http://stackoverflow.com/questions/3394835/args-and-kwargs) – OdraEncoded

+0

@Odra編碼實際上我想知道的不是* args和** kwargs可以工作,但實例化一個對象並將這些參數傳遞給webapp2 web應用程序。 – vmussa

回答

0

*args表示'所有位置參數',**kwargs表示'所有關鍵字參數'。它的神奇來自小星星(***),而不是名稱(實際上,它可以是任何名稱,例如*foo**bar可以實現相同的效果)。

***可以用在任何函數中,而不僅僅是構造函數。參數存儲在恆星後面的變量中;例如,print args將打印列表的位置參數,而print kwargs將顯示關鍵字參數的字典

在類似於你的問題的繼承案例中,使用所有傳遞給子類構造函數的參數調用 基類是很常見的。

ApplicationHandler繼承在構造webapp2.RequestHandler和 它與super 關鍵字調用父類(基類),將其傳遞給它的所有參數。

讓我們研究這個例子:

class A: 
    def __init__(self, arg1): 
    self.my_value = arg1 

class B(A): 
    def __init__(self, *args): 
    super(B, self).__init__(*args) 

b = B("HELLO") 

print b.my_value將顯示HELLO,因爲傳遞到B 構造函數的參數已經傳遞給一個構造函數中__init__。 如果您在B.__init__中添加print args,您將會看到("HELLO",)

+0

感謝您的回答,但誰是會在Web應用程序環境中執行「b = B(」HELLO「)」作業的人,特別是在webapp2中?我問過它了嗎? – vmussa

+0

對不起,我不明白你的問題...通常請求處理程序映射到一個URI,並加載URI時實例化。我想你的問題中的「誰」可能是WSGI應用程序。要調試傳遞給它的內容,只需從顯示args和kwargs開始。 – mguijarr

相關問題