Python中**kwargs使用报错:函数接受6个位置参数却传入8个
问题原因及解决方案
嘿,这个错误其实是对**kwargs的使用规则理解不到位导致的,我来给你拆解一下:
错误根源
你的函数gradient_descent定义里,位置参数只有6个:g,x,y,alpha,max_its,w,而**kwargs是用来接收关键字形式传递的额外参数(比如key=value这种),不能接收位置参数。
但你调用函数的时候,在w_train后面直接传了num_pts,batch_size这两个位置参数,加上前面的6个,总共就有8个位置参数,这就触发了TypeError: gradient_descent() takes 6 positional arguments but 8 were given的报错。
另外我注意到,你的函数定义里根本没处理num_pts这个参数,所以这个参数其实是多余的,完全可以去掉。
修复步骤
1. 修正函数调用方式
把需要传入的额外参数都改成关键字参数的形式传递,去掉多余的num_pts,修改后的调用代码应该是:
weight_hist_2,train_hist_2 = gradient_descent(g,x_train,y_train,alpha_choice,max_its,w_train,batch_size=10,verbose=False)
这样所有额外参数都通过**kwargs接收,不会和位置参数冲突。
2. 优化函数内的kwargs处理(可选)
你现在的kwargs判断可以用dict.get()简化,代码更简洁:
def gradient_descent(g,x,y,alpha,max_its,w,**kwargs): # switch for verbose verbose = kwargs.get('verbose', True) # 默认True,有传参就覆盖 # determine num train and batch size num_train = y.size()[1] batch_size = kwargs.get('batch_size', num_train) # 默认num_train,有传参就覆盖 # ......
这样既保持功能不变,代码也更易读。
内容的提问来源于stack exchange,提问作者Haoyang Han
相关产品推荐
相关产品推荐

