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

如何将Python函数签名自动转换为dataclass?

自动将函数签名转换为dataclass的实现方案

结论

完全可以通过自省技巧实现这一需求,甚至不需要元类(元类也能实现,但自省方案更简洁直接)。

核心实现思路

利用Python标准库的inspect模块提取函数的签名信息(参数名、类型注解、默认值),再结合dataclasses.make_dataclass动态生成对应的dataclass类。

具体代码实现

工具函数定义

from dataclasses import dataclass, make_dataclass, asdict
import inspect

def generate_args_dataclass(func):
    # 获取函数的完整签名
    sig = inspect.signature(func)
    # 整理dataclass需要的字段信息
    fields = []
    for param_name, param in sig.parameters.items():
        field_components = [param_name]
        # 添加类型注解(如果存在)
        if param.annotation is not inspect.Parameter.empty:
            field_components.append(param.annotation)
        # 添加默认值(如果存在)
        if param.default is not inspect.Parameter.empty:
            field_components.append(param.default)
        fields.append(tuple(field_components))
    
    # 生成类名(原函数名首字母大写 + Args)
    class_name = f"{func.__name__.capitalize()}Args"
    # 动态创建dataclass
    return make_dataclass(class_name, fields)

使用示例

  1. 定义原函数
def foo(a: int, b: str, c: float = 2.0) -> None:
    print(f"a={a}, b={b}, c={c}")
  1. 生成对应的dataclass
FooArgs = generate_args_dataclass(foo)
  1. 基于dataclass调用原函数
args = FooArgs(a=1, b="bar", c=3.0)
foo(**asdict(args))  # 输出:a=1, b=bar, c=3.0

方案优势

  • 无需手动编写dataclass代码,完全自动化
  • 基于标准库实现,无需额外依赖
  • 处理了参数的类型注解和默认值,完美还原函数签名
  • 避免了exec这类动态执行代码的风险,安全性更高

关于元类的实现(可选)

虽然可以用元类实现,但属于过度设计,因为上述自省方案已经足够简洁高效。如果一定要用元类,核心思路是在元类的__new__方法中,接收目标函数并提取参数信息,动态生成类字段。但这种方式会增加代码复杂度,不推荐。


内容的提问来源于stack exchange,提问作者Till S

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 14:52:42