动态复制函数签名至Lambda后,help输出的签名被截断求助
Lambda函数签名复制后help输出截断的解决办法
直接给lambda的__signature__赋值inspect.Signature对象时,help函数会错误拼接lambda的原始定义与自定义签名,导致输出截断。以下是两种解决方法:
方法一:使用functools.wraps(推荐)
这是Python中复制函数元数据的标准方式,能完整继承原函数的签名、文档等信息:
from inspect import signature from functools import wraps def funcA(a: str) -> str: return a.lower() # 用wraps装饰lambda,复制funcA的元数据 funcB = wraps(funcA)(lambda a: funcA(a)) help(funcB)
执行后help输出正常:
Help on function funcA in module __main__: funcB(a: str) -> str <lambda>
方法二:手动修正元数据
如果需要自定义显示效果,可以手动修改lambda的__name__和__doc__,配合__signature__使用:
from inspect import signature def funcA(a: str) -> str: return a.lower() funcB = lambda a: funcA(a) sig = signature(funcA) # 修改名称让显示更友好,同时构造匹配的文档字符串 funcB.__name__ = "funcB" funcB.__signature__ = sig funcB.__doc__ = f"{funcB.__name__}{sig}" help(funcB)
输出效果:
Help on function funcB in module __main__: funcB(a: str) -> str funcB(a: str) -> str
原方法失效原因
help函数处理lambda时,会优先读取其原始代码片段(如lambda a:),再尝试拼接__signature__的内容,两者格式不兼容,最终导致签名被截断。而functools.wraps会替换lambda的核心元数据,让help正确识别并显示完整签名。
内容的提问来源于stack exchange,提问作者mginn
相关产品推荐
相关产品推荐

