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

如何为动态生成的Python代理函数设置help()显示的签名?

动态修改Python函数的调用签名(保留内部*args/**kwds实现)

完全可以实现你的需求——不需要改变proxy函数内部*args和**kwds的核心逻辑,仅从调用者视角修改签名显示,同时支持IDE关键字参数自动补全。下面是两种实用方案:

方案1:直接设置函数的__signature__属性

Python 3.3+ 允许通过修改函数的__signature__属性,自定义它对外展示的签名。你可以用inspect.Signature构造出和远程API匹配的签名,再赋值给proxy函数:

import inspect

def proxy(*args, **kwds):
    # 1. 验证参数是否匹配远程API
    # 2. 转发调用到远程API
    # 3. 解析并返回响应
    pass

# 构造你推断出的远程API签名示例
target_signature = inspect.Signature(
    parameters=[
        # 必填参数:user_id(整数类型)
        inspect.Parameter(
            name='user_id',
            kind=inspect.Parameter.POSITIONAL_OR_KEYWORD,
            annotation=int
        ),
        # 可选参数:include_details(布尔类型,默认False)
        inspect.Parameter(
            name='include_details',
            kind=inspect.Parameter.POSITIONAL_OR_KEYWORD,
            default=False,
            annotation=bool
        )
    ]
)

# 给proxy函数设置自定义签名
proxy.__signature__ = target_signature

设置完成后,调用help(proxy)会显示你构造的签名,主流IDE(如PyCharm、VS Code)也能基于这个属性提供参数自动补全。

方案2:用装饰器批量处理动态生成的函数

如果你的库需要批量生成大量proxy函数,推荐用装饰器封装签名设置逻辑,更易维护:

import inspect

def set_api_signature(target_sig):
    """装饰器:给函数设置自定义的API签名"""
    def decorator(func):
        func.__signature__ = target_sig
        return func
    return decorator

# 使用示例:给proxy绑定推断出的签名
@set_api_signature(inspect.Signature(
    parameters=[
        inspect.Parameter('user_id', inspect.Parameter.POSITIONAL_OR_KEYWORD, annotation=int),
        inspect.Parameter('include_details', inspect.Parameter.POSITIONAL_OR_KEYWORD, default=False, annotation=bool)
    ]
))
def proxy(*args, **kwds):
    # 原有逻辑不变
    pass

关键注意事项

  • 确保构造的签名和远程API的实际参数规则完全一致,否则用户按签名传参后,内部的参数验证步骤会报错,反而影响体验。
  • 这种方式仅修改对外展示的签名,函数内部仍然通过*args和**kwds接收参数,完全保留你原有的参数验证、请求转发逻辑。
  • 和你提到的动态定义函数签名的问题不同:那些方案通常会修改函数的实际定义(比如用exec动态生成函数),而本方案完全保留原函数的实现,只调整调用者视角的表现。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 04:40:25