You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 05:21:03