inspect.getargvalues返回仅关键字参数为args而非varargs,是bug吗?
结论先行
这个现象既不是功能实现的bug,也不是文档描述的bug,本质是对两个概念的混淆:inspect.getargvalues的字段分类逻辑,和「仅关键字参数」的定义语境。
核心概念澄清
首先要区分两个完全不同的「关键字参数」语境:
- 定义层面的仅关键字参数:是函数签名里
*之后声明的参数,要求调用时必须通过关键字形式传值,属于函数显式声明的固定参数。 - 调用层面的关键字传参:指调用函数时用
参数名=值形式传入的参数,和参数本身的定义类型无关,位置参数也可以用关键字形式传值。
inspect.getargvalues返回字段的设计逻辑
官方文档的描述并没有问题,只是没有特意补充Python 3新增仅关键字参数后的适配逻辑:
inspect.getargvalues(frame)
返回命名元组ArgInfo(args, varargs, keywords, locals):args是参数名列表,varargs和keywords分别是*和**可变参数的参数名(没有则为None),locals是对应帧的本地变量字典。
这里的args字段存的是所有函数签名里显式声明的非可变参数,不管是位置参数、仅位置参数还是仅关键字参数,只要不是*、**定义的可变收集参数,都会被归入args列表。
而varargs和keywords只对应*、**这两个可变参数本身的名字,和调用时有没有用关键字传参、有没有仅关键字参数没有任何关系。
验证示例
我们可以加可变参数再测试,逻辑会更清晰:
import inspect def fun(x, *var_args, y, **kw_args): print(inspect.getargvalues(inspect.currentframe())) # 调用 fun(10, 11, 12, y=20, z=30)
输出结果如下,可以看到仅关键字参数y依然在args列表里,varargs和keywords只对应可变参数的名字:
ArgInfo(args=['x', 'y'], varargs='var_args', keywords='kw_args', locals={'x': 10, 'var_args': (11, 12), 'y': 20, 'kw_args': {'z': 30}})
内容的提问来源于stack exchange,提问作者Wör Du Schnaffzig
相关产品推荐
相关产品推荐

