【问题标题】:Class __init__ with mix of fixed and variable length **kwargs arguments类 __init__ 混合了固定长度和可变长度 **kwargs 参数
【发布时间】:2020-07-29 10:26:04
【问题描述】:

我有一个有两个必须有参数的类,我想为它提供一个可选参数字典。我在 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)

【问题讨论】:

  • 在字典前面加上 ** 以将其解压缩为函数的关键字参数 - Dataset(source, targets, **kwargs)

标签: python


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-08-30
    • 2019-06-02
    • 2018-06-14
    • 2017-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-02
    相关资源
    最近更新 更多