inspect.signature() 返回的是 Signature 对象,它是一个封装参数结构的不可变容器,包含 parameters 属性(OrderedDict),每个值为 Parameter 实例;直接遍历会报错,需通过 .parameters 访问。

inspect.signature() 返回的是什么类型?
inspect.signature() 返回的是 Signature 对象,不是字典也不是字符串,而是一个封装了参数结构的不可变容器。它内部包含 parameters 属性(OrderedDict 类型),每个键是参数名,值是 Parameter 实例。
常见误用是直接 print 或试图用 .keys() 遍历 signature 本身——这会报 TypeError: 'Signature' object is not iterable。正确做法是访问 .parameters:
import inspect <p>def example(a, b: int = 10, *args, **kwargs): pass</p><p>sig = inspect.signature(example) print(list(sig.parameters.keys())) # ['a', 'b', 'args', 'kwargs'] print(sig.parameters['b'].default) # 10 print(sig.parameters['b'].annotation) # <class 'int'>
如何安全提取带默认值的参数列表?
不是所有参数都有默认值,Parameter.default 是 inspect.Parameter.empty 表示无默认值;Parameter.kind 决定是否能被显式传入(比如 *args 和 **kwargs 的 kind 是 VAR_POSITIONAL / VAR_KEYWORD)。
提取“可选参数”(即有默认值且非 *args/**kwargs)时,需同时检查 default 和 kind:
立即学习“Python免费学习笔记(深入)”;
Parameter.default is not inspect.Parameter.emptyparam.kind not in (inspect.Parameter.VAR_POSITIONAL, inspect.Parameter.VAR_KEYWORD)
漏掉 kind 判断会导致把 *args 当作可选参数——它虽然 default 是 empty,但语义上不参与签名默认值逻辑。
让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限
inspect.signature() 在装饰器里为什么常返回 (*args, **kwargs)?
这是装饰器未保留原函数签名导致的。如果装饰器没用 @functools.wraps(func),被装饰函数的 __name__、__doc__ 和最重要的是 __signature__ 都会丢失,inspect.signature() 只能退化为通用签名。
修复方式只有两种:
- 在装饰器内手动设置
wrapped.__signature__ = inspect.signature(func) - 更稳妥地用
@functools.wraps(func)(它会自动同步__signature__)
注意:Python 3.5+ 的 functools.wraps 已默认处理 signature,但自定义装饰器若绕过 wraps 或重写 __signature__,仍可能出问题。
获取签名时遇到 built-in 函数报 ValueError 怎么办?
对 C 实现的内置函数(如 len、print、open),inspect.signature() 会抛 ValueError: no signature found。这不是 bug,而是因为这些函数没有 Python 层的参数定义。
可行的应对方式:
- 用
try/except ValueError捕获,降级为返回空签名或占位信息 - 对已知内置函数硬编码模拟签名(例如
len→(obj)),但要注意版本差异(如open参数在 Py3.12 有调整) - 避免在通用工具中强依赖
signature处理内置函数,优先走文档或类型提示(typing注解)路径
真正麻烦的是那些「看起来像 Python 函数但其实是 builtin」的对象——比如某些扩展模块导出的函数,它们的行为和内置函数一致,也必须按同样逻辑兜底。

















