当前位置: 首页 > news >正文

python中`__annotations__` 和 `inspect` 模块区别??

__annotations__inspect 模块在 Python 中都与类型注解(type annotations)有关,但它们的作用范围和使用方式有显著区别。下面我们从多个维度来详细对比这两者。


🧩 一、__annotations__ 是什么?

__annotations__ 是 Python 中类、函数或模块对象的一个内置属性,用于存储类型注解。它是一个字典,其中键是变量名或参数名,值是类型对象。

示例:

def func(a: int, b: str) -> bool:pass
print(func.__annotations__)
# 输出:{'a': <class 'int'>, 'b': <class 'str'>, 'return': <class 'bool'>}

对于类来说,__annotations__ 只包含类级别的变量注解,不包含方法参数或返回值的注解:

class MyClass:x: inty: str = "hello"def method(self, a: float) -> bool:return True
print(MyClass.__annotations__)
# 输出:{'x': <class 'int'>, 'y': <class 'str'>}

🔍 二、inspect 模块是什么?

inspect 是 Python 标准库中的一个模块,用于动态检查对象的结构,包括类、函数、方法、模块等。它不仅可以获取类型注解,还能获取参数列表、默认值、源码、文档字符串等更丰富的信息。

常用功能:

  • inspect.signature():获取函数/方法的签名(包括参数名、默认值、类型注解等)
  • inspect.getmembers():列出对象的所有成员
  • inspect.isfunction() / inspect.ismethod():判断对象是否为函数或方法
  • inspect.getsource():获取源代码

示例:

import inspect
def func(a: int, b: str = "hi") -> bool:return True
sig = inspect.signature(func)
print(sig)
# 输出:(a: int, b: str = 'hi') -> bool
for param in sig.parameters.values():print(param.name, ":", param.annotation)
# 输出:
# a : <class 'int'>
# b : <class 'str'>

🆚 三、核心区别对比

项目__annotations__inspect 模块
作用范围只获取类型注解可获取注解、参数、默认值、源码、文档等
内容丰富度仅字典结构,仅包含注解结构化对象,包含完整的函数/方法签名信息
适用对象类、函数、模块函数、方法、类、模块、帧对象等
获取方式直接访问 obj.__annotations__通过 inspect.signature() 等函数获取
能否获取默认值❌ 不能✅ 可以
能否获取参数顺序❌ 不能✅ 可以
能否获取方法签名❌ 只能获取类变量注解✅ 可以,包括参数名、类型、默认值、返回值

🧪 四、实际使用场景建议

使用 __annotations__ 的场景:

  • 只需要类型注解,不关心参数顺序、默认值等。
  • 代码简单,不想引入额外的模块。
  • 在元类或装饰器中快速检查类变量类型。

使用 inspect 的场景:

  • 你需要完整的函数/方法签名,包括参数名、顺序、默认值、类型注解等。
  • 需要动态生成文档、进行参数校验、实现依赖注入等高级功能。
  • 需要分析对象结构,如列出所有方法、属性等。

✅ 五、总结

对比项推荐使用
只需要类型注解__annotations__
需要完整方法签名inspect.signature()
需要参数顺序/默认值inspect
需要动态分析对象inspect
如果你只是想查看类型注解,__annotations__ 足够轻量;但如果你需要更深入的分析(如参数顺序、默认值、方法签名等),inspect 是更强大的选择。

文章转载自:

http://00000000.hrtct.cn
http://00000000.hrtct.cn
http://00000000.hrtct.cn
http://00000000.hrtct.cn
http://00000000.hrtct.cn
http://00000000.hrtct.cn
http://00000000.hrtct.cn
http://00000000.hrtct.cn
http://00000000.hrtct.cn
http://00000000.hrtct.cn
http://00000000.hrtct.cn
http://00000000.hrtct.cn
http://00000000.hrtct.cn
http://00000000.hrtct.cn
http://00000000.hrtct.cn
http://00000000.hrtct.cn
http://00000000.hrtct.cn
http://00000000.hrtct.cn
http://00000000.hrtct.cn
http://00000000.hrtct.cn
http://00000000.hrtct.cn
http://00000000.hrtct.cn
http://00000000.hrtct.cn
http://00000000.hrtct.cn
http://00000000.hrtct.cn
http://00000000.hrtct.cn
http://00000000.hrtct.cn
http://00000000.hrtct.cn
http://00000000.hrtct.cn
http://00000000.hrtct.cn
http://www.dtcms.com/a/364787.html

相关文章:

  • 【Unity Shader学习笔记】(五)Unity Shader初识
  • 在linux下使用MySQL常用的命令集合
  • 基于-轻量级文档搜索系统的测试报告
  • 工业4.0时代的通信革命:OPC UA Pub/Sub机制全面解析
  • 车载诊断架构 --- 从架构系统角度怎么确保整车DTC的完整性?
  • 关于缓存的一些思考?
  • SPI通讯协议
  • 【AI】人工智能 传统和现代 架构和算法的演变历史
  • 控制View缩放与还原
  • Go 语言面试题详解之上下文 (Context) 解密
  • 开学季 老师必备的收集信息“神器”
  • 利用 Python 绘制环形热力图
  • 使用飞算JavaAI快速搭建酒店管理系统
  • Augmentcode免费额度AI开发WordPress商城实战
  • VBA 64位API声明语句第013讲
  • leetcode算法刷题的第二十五天
  • LiteFlow:国产流程编排引擎体验
  • 疯狂星期四文案网第59天运营日记
  • 机器学习从入门到精通 - 降维艺术:PCA与t-SNE带你玩转高维数据可视化
  • 【Unity开发】热更新学习——AssetBundle
  • 【wpf】WPF 自定义控件绑定数据对象的最佳实践
  • 戴尔笔记本电池健康度检测、无电池开机测试与更换电池全流程记录
  • 52DH Pro网址导航系统开源版
  • 因地制宜选购壁挂炉,家庭采暖更舒适
  • 【保姆级选型指南】2025年国产开源AI算力平台怎么选?覆盖企业级_制造业_国际化场景
  • C++ ---- 模板的半特化与函数模板的偏特化
  • [鸿蒙心迹]鸿蒙培训讲师带新人学鸿蒙的悲欢离合
  • Deformable 3D Gaussians:把动态场景装进“可变形的静态世界”
  • React Hooks小技巧-防止async函数抖动触发
  • AI 时代零售数据底座怎么建?首份《零售一体化云数据库白皮书》发布