得到了一个意想不到的关键字参数,真的被难住了[重复]

问题描述 投票:0回答:2

我有以下代码。我将只包括有问题的部分:

class C:
    def __init__(self,**kwargs):
        self.kwargs = kwargs

    def fit(...):
        ...
        c = self.learner(**self.kwargs)

我正在尝试将其与以下课程一起使用:

class learner:
    def __init__(self, X):
        self.X = X
kwargs={'X': X}
inst = C(kwargs=kwargs)
inst.fit(...)

这会在

inst.fit(...)
行产生错误。错误是:
 learner.__init__() got an unexpected keyword argument 'kwargs'
。如何修复我的实例化?尽管使用了
**
,但字典似乎没有被解压。非常感谢您的帮助。

python machine-learning syntax parameter-passing argument-unpacking
2个回答
0
投票

通过在

kwargs
的构造函数中解构您的
Boost
,您实际存储在
self.kwargs
中的是一个如下所示的字典:

{'kwargs': {'X': x_train, 'y': y_train, 'stride': 12, 's_stride': 17 }

使用

wk_learner
将其传递给
**self.kwargs
构造函数意味着 python 尝试查找名为
kwargs
的关键字参数,但该参数不存在,因此会出现错误消息。

您可以通过不在

Boost
构造函数中进行解构来解决问题(也可以重命名参数以避免混淆):

def __init__(self, base_learner, base_learner_kwargs):
    self.base_learner = base_learner
    self.base_learner_kwargs = base_learner_kwargs

def fit(self, X: np.ndarray, y: np.ndarray):
    ...
    clf = self.base_learner(**self.base_learner_kwargs)

0
投票

问题在于您在函数调用中显式定义了关键字参数

kwargs

inst = Boost(base_learner=wk_learner, kwargs=kwargs)

您的

wk_learner
类不知道如何使用。

我认为你想要做的只是通过

传递 kwargs 的内容
inst = Boost(base_learner=wk_learner, **kwargs)

请注意,

args
kwargs
不是参数列表和关键字参数字典的定义名称。它们只是建立的默认名称。您可以使用任何变量名称。

© www.soinside.com 2019 - 2024. All rights reserved.