2013-06-26 68 views
-1

我有這樣的事情:最好的方式來傳遞kwargs參數覆蓋方法

MyClass(BaseClass): 
    def __init__(self, *args, **kwargs): 
     data = kwargs.pop('data', None) 
     super(BaseClass, self).__init__(*args, **kwargs) 

BaseClass的是API包裝的代表,它的初始化方法受到了很多的喜歡,API_KEY,API_SECRET參數, OAUTH_TOKEN和OUATH_TOKEN_SECRET。我的問題是關於什麼是創建MyClass實例的正確或最清潔的方式。我不知道這會工作:

if __name__ == '__main__': 
    obj = MyClass(
     API_KEY, 
     API_SECRET, 
     OAUTH_TOKEN, 
     OAUTH_TOKEN_SECRET, 
     {'data': DATA} 
    ) 

所以,讓我們假設的作品,是它更好地包裝在一個字典所有參數,並通過他們向MYCLASS?

回答

3

**kwargs需要關鍵字參數,沒有字典:

obj = MyClass(
    API_KEY, 
    API_SECRET, 
    OAUTH_TOKEN, 
    OAUTH_TOKEN_SECRET, 
    data=DATA 
) 

當然,你可以使用**kwargs調用習慣有你的字典中的關鍵字參數仍然適用:

obj = MyClass(
    API_KEY, 
    API_SECRET, 
    OAUTH_TOKEN, 
    OAUTH_TOKEN_SECRET, 
    **{'data': DATA} 
) 

無論是否將其餘參數打包到關鍵字參數中,完全取決於BaseClass上的原始方法;它是否接受這些參數作爲關鍵字參數?在Python 3中,不一定是給定的,也不是內置的(C定義的)函數和方法總是接受關鍵字參數而不是位置參數。