You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 15:48:03