向解引用函数传递**kwargs时,为何多余参数会导致报错?
为什么调用
kwarg_function(some_func, a=1, b=2, c=3)会因意外关键字参数失败? Python在通过**kwargs解包调用函数时,会将所有传入的关键字参数完整传递给目标函数,不会自动忽略目标函数未定义的参数。
你的some_func只声明了a和b两个必选参数,没有设置**kwargs来接收额外的关键字参数。当你传递c=3时,Python会判定这是some_func不接受的参数,直接抛出TypeError。
解决办法
有两种常见方式处理这种场景:
1. 在调用前过滤无效参数
借助inspect模块获取目标函数的参数签名,筛选出它能接受的参数后再传递:
import inspect def kwarg_function(function, **kwargs): sig = inspect.signature(function) # 只保留目标函数定义过的参数 valid_kwargs = {k: v for k, v in kwargs.items() if k in sig.parameters} print(valid_kwargs) function(**valid_kwargs) def some_func(a, b): print(f"type: {type(a)} values: {a}") print(f"type: {type(b)} values: {b}") kwarg_function(some_func, a=1, b=2, c=3) # 调用成功,c被过滤
2. 让目标函数接受额外参数
修改some_func,添加**kwargs来接收所有多余的关键字参数:
def kwarg_function(function, **kwargs): print(kwargs) function(**kwargs) def some_func(a, b, **kwargs): print(f"type: {type(a)} values: {a}") print(f"type: {type(b)} values: {b}") kwarg_function(some_func, a=1, b=2, c=3) # 调用成功,c被**kwargs接收
内容的提问来源于stack exchange,提问作者eklektek
相关产品推荐
相关产品推荐

