固定长度和可变长度** kwargs参数混合使用的__init__类

时间:2020-07-29 02:04:04

标签: python

我有一个带有两个必须有参数的类,我想为它提供一个可选参数的字典。我在tensorflow optimizers中看到了类似的类定义样式。一个最小的示例如下所示:

class Dataset:
    def __init__(self, source, target, **kwargs):
        self.source = source
        self.target = target
        self.shuffle = kwargs['shuffle']
        
    def shuffle(self):
        return self
    
    
if __name__ == "__main__":
    source = [1, 2, 3, 4]
    targets = [0, 0, 1, 1]
    
    kwargs = {
        'shuffle' : False,
        'shift' : 10
    }
    
    trainset = Dataset(source, targets, kwargs)

并产生错误:

  File "test.py", line 20, in <module>
    trainset = Dataset(source, targets, *kwargs)
TypeError: __init__() takes 3 positional arguments but 5 were given

除了帮助我解决错误之外,如果这种类型的类定义混合使用固定参数和可变参数的方法不是最佳实践,我将不胜感激。

解决方案:在发表评论和回复后,解决方案是使用Dataset(source, targets, **kwargs)

1 个答案:

答案 0 :(得分:0)

如果将** kwargs传递给构造函数,它将起作用,则需要将dict元素解压缩到函数中。另请参见pass **kwargs argument to another function with **kwargs