我有以下代码。我将只包括有问题的部分:
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'
。如何修复我的实例化?尽管使用了**
,但字典似乎没有被解压。非常感谢您的帮助。
通过在
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)
问题在于您在函数调用中显式定义了关键字参数
kwargs
inst = Boost(base_learner=wk_learner, kwargs=kwargs)
您的
wk_learner
类不知道如何使用。
我认为你想要做的只是通过
传递 kwargs 的内容inst = Boost(base_learner=wk_learner, **kwargs)
请注意,
args
和kwargs
不是参数列表和关键字参数字典的定义名称。它们只是建立的默认名称。您可以使用任何变量名称。