如何获取Python继承数据类中完整的类型注解?
- 内容介绍
- 文章标签
- 相关推荐
本文共计772个文字,预计阅读时间需要4分钟。
`get_type_hints()`函数用于从类(如`b`)中递归解析父类注释中的类型注解,而非实例(如`b`)。只有当传入的是类而非实例时,它才能解析出类的直接父类中的注解;对于直接传入实例,它只返回实例所属类中的直接注解,忽略继承链。
在 Python 数据类(@dataclass)的类型反射场景中,一个常见误区是误将 typing.get_type_hints() 应用于实例对象,期望它自动聚合继承链上的所有字段类型注解。但根据 官方文档 和源码实现,get_type_hints() 的第一个参数应为类型(type),例如 get_type_hints(B),而非实例 get_type_hints(b)。
当传入实例时(如 get_type_hints(b)),函数内部会通过 obj.__class__ 获取其类型,但不会主动向上遍历 MRO(Method Resolution Order)合并父类的 __annotations__ —— 它仅对目标类自身的 __annotations__ 进行求值(包括对字符串字面量、from __future__ import annotations 下延迟解析的支持),而不会递归合并基类注解。
本文共计772个文字,预计阅读时间需要4分钟。
`get_type_hints()`函数用于从类(如`b`)中递归解析父类注释中的类型注解,而非实例(如`b`)。只有当传入的是类而非实例时,它才能解析出类的直接父类中的注解;对于直接传入实例,它只返回实例所属类中的直接注解,忽略继承链。
在 Python 数据类(@dataclass)的类型反射场景中,一个常见误区是误将 typing.get_type_hints() 应用于实例对象,期望它自动聚合继承链上的所有字段类型注解。但根据 官方文档 和源码实现,get_type_hints() 的第一个参数应为类型(type),例如 get_type_hints(B),而非实例 get_type_hints(b)。
当传入实例时(如 get_type_hints(b)),函数内部会通过 obj.__class__ 获取其类型,但不会主动向上遍历 MRO(Method Resolution Order)合并父类的 __annotations__ —— 它仅对目标类自身的 __annotations__ 进行求值(包括对字符串字面量、from __future__ import annotations 下延迟解析的支持),而不会递归合并基类注解。

