使用**kwargs定义函数传入字典报错:most_courses()不接受位置参数却传入1个
为什么**kwargs没法直接接收传入的字典?
嘿,这个问题其实是对Python里**参数的用法有点小误解,咱们一步步理清楚:
首先看你的错误提示:most_courses() takes 0 positional arguments but 1 was given,原因很简单——你调用函数的时候传了一个位置参数(那个字典),但你的函数定义里**diction是用来接收关键字参数**并自动打包成字典的,它本身不接收位置参数,所以Python就报错啦。
你现在的代码问题在哪?
你的函数定义:
def most_courses(**diction): for key, value in diction.items(): print("{} {}".format(key,value))
这里的**diction是告诉Python:“把所有传入的关键字参数(比如Andrew=['x','y']这种)打包成一个字典,名字叫diction”。
但你调用的时候是直接传了一个字典:
most_courses({'Andrew Chalkley': ['jQuery Basics', 'Node.js Basics'],'Kenneth Love': ['Python Basics', 'Python Collections']})
这时候Python会把这个字典当成一个单独的位置参数传给函数,但函数没定义任何位置参数,所以就触发了那个报错。
两种解决方法:
方法1:调用时用**解包字典
如果你想保留函数的**kwargs定义,那调用的时候要在字典前面加**,告诉Python“把这个字典里的键值对拆成关键字参数传进去”:
instructors = {'Andrew Chalkley': ['jQuery Basics', 'Node.js Basics'],'Kenneth Love': ['Python Basics', 'Python Collections']} most_courses(**instructors)
这样函数里的diction就会接收到正确的字典,正常遍历打印。
方法2:修改函数定义为接收普通字典参数
如果你的需求本来就是直接传一个字典进去,那没必要用**kwargs,直接定义成普通参数就行:
def most_courses(diction): for key, value in diction.items(): print("{} {}".format(key,value))
这时候原来的调用代码就可以正常运行了,不需要加任何前缀。
简单总结下:**在函数定义里是“打包关键字参数为字典”,在函数调用里是“解包字典为关键字参数”,两者要配合使用哦~
内容的提问来源于stack exchange,提问作者Sky Nam
相关产品推荐
相关产品推荐

