如何使用Python和inspect模块匹配函数变量名与默认值?
解决
inspect.getfullargspec中args与defaults的匹配问题 嘿,这个问题我之前也踩过坑!inspect.getfullargspec返回的args和defaults并不是按顺序一一对应的,这就是你直接打包成字典会出问题的原因——听我给你掰扯清楚:
核心逻辑:args与defaults的对应关系
args是函数所有位置参数的完整列表,而defaults只包含最后N个参数的默认值(N是有默认值的参数数量)。比如你的例子里:
args=['x', 'y']:两个位置参数defaults=(4,):说明只有最后1个参数(也就是y)有默认值,值为4
这就意味着,不能直接把args和defaults全量打包,必须先拆分出「无默认值的参数」和「带默认值的参数」。
正确打包成字典的代码示例
import inspect # 先修正你函数里的笔误(原代码写的return a+b应该是return x+y) def foo(x:int,y:int=5) -> int: return x+y # 获取参数规格 spec = inspect.getfullargspec(foo) # 处理defaults为None的情况(函数无默认参数时) if spec.defaults: # 计算带默认值参数的起始索引 default_start_idx = len(spec.args) - len(spec.defaults) # 拆分参数列表 no_default_args = spec.args[:default_start_idx] default_args = spec.args[default_start_idx:] # 组合成完整的参数字典:无默认值的参数设为None,带默认值的用defaults填充 args_dict = {arg: None for arg in no_default_args} args_dict.update(dict(zip(default_args, spec.defaults))) else: # 无默认参数时,直接生成值为None的字典 args_dict = {arg: None for arg in spec.args} print(args_dict) # 输出: {'x': None, 'y': 5}
为什么直接打包会失败?
如果尝试直接dict(zip(spec.args, spec.defaults)),会因为两个列表长度不匹配(args长度2,defaults长度1)抛出ValueError,就算没报错,也会错误地把x和4配对,完全不符合函数定义的逻辑。
额外说明
如果你的函数有多个带默认值的参数,比如def bar(a, b=2, c=3),那么defaults会是(2,3),对应args的最后两个参数b和c,用上面的代码也能正确配对。
内容的提问来源于stack exchange,提问作者code base 5000
相关产品推荐
相关产品推荐

