2013-06-26 69 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定义的)函数和方法总是接受关键字参数而不是位置参数。