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

如何使用inspect.Signature修改类方法的参数与类型提示

问题

我定义了这样一个类:

class Foo:
    def __init__(self, *args, **kwargs):
        pass

目前__init__的签名是*args和**kwargs,我想通过inspect.Signature来检查并修改这个方法的参数名称和类型提示,现在已经有一个包含所有字段名与对应类型提示的字典(示例如下),请问具体该怎么操作?

from typing import Optional
param_types = {"param": Optional[str]}  # 示例字典
解决方案

你可以通过inspect模块的Signature和Parameter类构建新的方法签名,再将其绑定到__init__方法上,具体步骤如下:

  1. 导入依赖模块
import inspect
from typing import Parameter, Signature
  1. 准备参数类型字典
    这里用你提供的示例字典(可根据实际需求替换):
from typing import Optional
param_types = {"param": Optional[str]}
  1. 构建新的参数列表
    首先保留self作为第一个参数,再将字典中的每个键值对转换为Parameter对象:
# 初始化参数列表,先加入self
parameters = [
    inspect.Parameter(
        name="self",
        kind=inspect.Parameter.POSITIONAL_OR_KEYWORD
    )
]

# 遍历参数类型字典,生成对应的Parameter对象
for param_name, param_type in param_types.items():
    parameters.append(
        inspect.Parameter(
            name=param_name,
            kind=inspect.Parameter.POSITIONAL_OR_KEYWORD,
            annotation=param_type
        )
    )
  1. 生成新签名并绑定到方法
# 创建新的Signature实例
new_signature = Signature(parameters=parameters)

# 将新签名赋值给__init__方法的__signature__属性
Foo.__init__.__signature__ = new_signature
  1. 验证修改结果
    用inspect.signature查看修改后的方法签名:
print(inspect.signature(Foo.__init__))
# 输出: (self, param: Optional[str]) -> None
  1. 可选:同步更新方法逻辑
    如果希望__init__实际处理这些参数,需要修改方法体来对应新参数,比如:
class Foo:
    def __init__(self, *args, **kwargs):
        # 将参数赋值给实例属性
        for param in param_types:
            setattr(self, param, kwargs.get(param))

# 修改签名后,调用时会有正确的类型提示,且可以按命名参数传入
foo_instance = Foo(param="hello")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 14:24:19