Python类实例化出现意外关键字参数错误的解决求助
问题解决:字典解包未生效导致的参数错误
问题代码与报错
类C的问题代码
class C: def __init__(self,**kwargs): self.kwargs = kwargs def fit(...): ... c = self.learner(**self.kwargs)
learner类代码
class learner: def __init__(self, X): self.X = X
实例化与调用代码
kwargs={'X': X} inst = C(kwargs=kwargs) inst.fit(...)
报错信息
learner.__init__() got an unexpected keyword argument 'kwargs'
错误原因
你实例化C时使用了C(kwargs=kwargs),而C的__init__通过**kwargs接收关键字参数。这会导致传入的kwargs字典被包装成嵌套字典:self.kwargs = {'kwargs': {'X': X}}。当fit方法执行self.learner(**self.kwargs)时,实际是把kwargs={'X': X}作为关键字参数传给learner的__init__,但learner只接受X参数,因此触发错误。
修正方案
方法1:实例化时直接解包字典(推荐)
修改实例化C的代码,用**直接解包你的kwargs字典,让C的__init__正确接收字典内的键值对:
kwargs={'X': X} inst = C(**kwargs)
此时self.kwargs的值为{'X': X},在fit方法里解包后会正确将X参数传给learner的__init__。
方法2:修改C的__init__参数(若需保留传入kwargs参数的形式)
如果必须以C(kwargs=kwargs)的形式实例化,可将C的__init__参数改为普通位置参数,而非**kwargs:
class C: def __init__(self, kwargs): self.kwargs = kwargs def fit(...): ... c = self.learner(**self.kwargs)
这样实例化时传入的kwargs字典会直接赋值给self.kwargs,后续解包可正常工作。
内容的提问来源于stack exchange,提问作者redbull_nowings
相关产品推荐
相关产品推荐

