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

如何将字典作为参数传入含位置参数与命名参数的函数?

解决方案

临时简洁写法(非通用)

如果只是针对foo这个特定函数,不需要通用工具的话,可以用一行代码完成拆分,不用手动修改原字典:

foo(*(params[k] for k in ('a', 'b')), **{k: v for k, v in params.items() if k not in ('a', 'b')})

这种写法直接提取必填位置参数的值,剩下的键值对作为关键字参数传递,避免了删除字典键的冗余操作。

通用解决方案:借助inspect实现separate函数

如果需要适配任意函数的通用拆分逻辑,必须借助inspect模块解析函数的参数签名,动态区分必填位置参数和可选/关键字参数。以下是简洁的实现:

import inspect
from typing import Dict, Callable, List, Any

def separate(params: Dict[str, Any], func: Callable) -> tuple[List[Any], Dict[str, Any]]:
    sig = inspect.signature(func)
    args = []
    kwargs = {}
    # 遍历函数参数定义,按规则拆分字典内容
    for param in sig.parameters.values():
        if param.name in params:
            # 无默认值的必填参数,归入位置参数列表
            if param.default is inspect.Parameter.empty:
                args.append(params[param.name])
            # 有默认值的可选参数,归入关键字参数字典
            else:
                kwargs[param.name] = params[param.name]
    return args, kwargs

# 使用示例
params = {'a':0, 'b':1, 'c':2, 'd':3}
def foo(a, b, c=None, d=None):
    pass

args, kwargs = separate(params, foo)
foo(*args, **kwargs)

这个函数会自动根据目标函数的参数定义,从字典中拆分出对应的位置参数列表和关键字参数字典,适配任意符合Python规范的函数。

相关未覆盖场景说明

之前的两个相关问题均未覆盖当前场景:

  • 如何传递与函数位置参数同名的关键字参数
  • 从字典中整齐地将位置参数作为args、可选参数作为kwargs传递

内容的提问来源于stack exchange,提问作者y.selivonchyk

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 11:25:34