Python中kwargs的关键字为何有时要写为字符串有时不需要?
问题解答
这个差异本质是Python处理**kwargs参数的语法规则导致的:
- 调用函数传关键字参数时,
myfunc(bird = 'turkey')里的bird是关键字参数的参数名,属于Python语法定义的标识符,不需要加引号。Python会自动把这些显式传入的关键字参数名转成字符串,作为key和对应的值一起打包存入字典传给kwargs。如果你在这里给bird加引号,反而会触发语法错误——Python不支持带引号的参数名写法。 - 进入函数内部后,
kwargs已经是一个标准的Python字典了,你传入的参数会变成字典里的键值对:{'bird': 'turkey'}。这时候你要判断key是否存在、或者取对应key的值,都必须和字典里的key类型完全匹配,也就是要用字符串'bird'作为查询条件。要是这里去掉引号直接写bird,Python会把它当成一个普通变量去全局/局部作用域查找,只要你没提前定义过叫bird的变量,直接就会报NameError。
你可以用字典解包的写法验证这个逻辑:调用函数时写myfunc(**{'bird': 'turkey'}),运行效果和你直接写myfunc(bird = 'turkey')完全一致,本质就是Python帮你把关键字参数的参数名自动转成了字典的字符串key。
内容的提问来源于stack exchange,提问作者Mark Featherstone
相关产品推荐
相关产品推荐

