Python中**kwargs与kwargs的区别及type(**kwargs)报错原因咨询
关于Python中**kwargs的本质与type(**kwargs)报错的解释
先看你提供的这段可正常运行的代码:
def chicken(sauce,part): print(f'you want the {part} of the chicken with {sauce}') def fish(type_,portion): print(f'you want a {portion} {type_} ') def order(dish,**kwargs): return dish(**kwargs) order(chicken,sauce = 'BBQ',part = 'leg') order(fish,type_ = 'salmon',portion = 'large')
**kwargs的本质
在函数定义里写**kwargs,是Python的语法约定:它会把调用函数时传入的所有未被位置参数捕获的关键字参数,打包成一个普通的dict类型变量(也就是kwargs)。所以你执行type(kwargs)得到<class 'dict'>是完全正常的——kwargs就是个字典。
为什么type(**kwargs)会报错?
**是Python的字典解包操作符,它只有在函数调用场景下才有意义:把一个字典的键值对拆成独立的关键字参数,传递给函数。
比如dish(**kwargs)这行代码,当kwargs是{'sauce': 'BBQ', 'part': 'leg'}时,等价于dish(sauce='BBQ', part='leg')——刚好匹配chicken函数的参数要求,所以能正常运行。
但type(**kwargs)就不一样了:这行代码会被解释成type(sauce='BBQ', part='leg'),而type()函数的定义只接受位置参数(比如type(123)、type('abc')),根本不支持传入sauce、part这类关键字参数,所以直接抛出TypeError: type() takes no keyword arguments的错误。
关键结论
kwargs是实实在在的字典变量,你可以对它做任何字典支持的操作;**是操作符,不是变量,不存在**kwargs这种“类型”——你不能对一个操作符做type()检查,就像你不能写type(+1)去问加号的类型一样;**kwargs只有在两种场景下有用:要么在函数定义时打包关键字参数为字典,要么在函数调用时解包字典为关键字参数。
内容的提问来源于stack exchange,提问作者Dan
相关产品推荐
相关产品推荐

