如何覆盖Python函数的argspec以优化help()输出?
修改Python函数的help显示签名
要让help(my_func)显示合并后的参数而非**kwargs,可以通过修改函数的__signature__属性实现——这是help()工具读取函数签名的核心属性。具体实现如下:
实现步骤
- 导入
inspect模块,用于提取子函数参数信息并构造新签名 - 合并两个子函数的参数列表与默认值
- 构造新的函数签名,覆盖原函数的
__signature__属性
完整代码示例
import inspect def my_subfunc_1(a=None, b=None): pass def my_subfunc_2(c=None, d=None): pass def my_func(**kwargs): # 拆分参数到对应子函数的逻辑 sub1_args = {k: v for k, v in kwargs.items() if k in ['a', 'b']} sub2_args = {k: v for k, v in kwargs.items() if k in ['c', 'd']} my_subfunc_1(**sub1_args) my_subfunc_2(**sub2_args) # 获取两个子函数的参数规格 spec1 = inspect.getfullargspec(my_subfunc_1) spec2 = inspect.getfullargspec(my_subfunc_2) # 合并参数列表与默认值(保持子函数的参数顺序) merged_param_names = spec1.args + spec2.args merged_defaults = spec1.defaults + spec2.defaults # 构造参数对象列表 params = [] for name, default in zip(merged_param_names, merged_defaults): params.append(inspect.Parameter( name, inspect.Parameter.POSITIONAL_OR_KEYWORD, default=default )) # 替换原函数的签名 my_func.__signature__ = inspect.Signature(parameters=params)
验证效果
执行help(my_func)后,会显示:
Help on function my_func in module main:
my_func(a=None, b=None, c=None, d=None)
内容的提问来源于stack exchange,提问作者Yes
相关产品推荐
相关产品推荐

