Python3.10使用__future__注解时如何从__annotations__获取可调用类对象
Python 3.10 延迟注解下获取类型注解对应类的最优方案
开启from __future__ import annotations后,所有类型注解会被延迟计算,存储为字符串形式,直接读取__annotations__只能拿到字符串,手动查globals()的方式无法处理非全局定义的类、嵌套类、局部导入类型等场景,存在兼容性问题。
最优解法:使用标准库typing.get_type_hints
这个函数是Python官方提供的类型注解解析工具,会自动处理字符串形式的延迟注解,结合定义所在的作用域解析为实际的类对象,无需手动查找全局变量。不要直接操作__annotations__私有属性,get_type_hints是官方指定的标准解析接口。
修改后的参考代码
from __future__ import annotations from dataclasses import dataclass from typing import get_type_hints @dataclass class Person: height: float def stack(self, other: Person): return Person(self.height + other.height) # 叠罗汉 @dataclass class Chair: height: float def stack(self, other: Chair): return Chair(0.6*(self.height + other.height) ) # 可堆叠椅子 @dataclass class Room: person: Person chair: Chair def set(self, name: str, val: float): # 复杂校验逻辑省略 # 调用get_type_hints获取解析后的注解字典 type_hints = get_type_hints(self.__class__) factory = type_hints[name] self.__setattr__(name, factory(height=val))
方案优势
- 完全符合Python官方标准,适配所有注解场景,包括嵌套类、局部导入的类型、类型别名等
- 无需手动处理作用域查找逻辑,避免
globals()查找不到非全局定义类的问题 - 兼容后续Python版本的类型注解特性迭代
内容的提问来源于stack exchange,提问作者mmdanziger
相关产品推荐
相关产品推荐

