Python 3.13中如何在运行时获取泛型的实际类型?
运行时获取Python泛型推断类型的实现方案
针对PEP 695风格的泛型类(如class Test[T]:),在Python 3.13中可通过以下方式实现get_type函数,获取实例化时传入的实际泛型类型:
完整实现代码
from typing import Optional, get_args class Test[T]: data: Optional[T] def __init__(self, data: Optional[T]): self.data = data actual_type = get_type(self) print(f"当前泛型类型: {actual_type}") def get_type(instance: Test) -> type: # 从实例的原始泛型类中提取类型参数 return get_args(instance.__orig_class__)[0] if __name__ == "__main__": Test[int](data=1) # 输出:当前泛型类型: <class 'int'> Test[str](data=None) # 输出:当前泛型类型: <class 'str'> Test[None](data=None) # 输出:当前泛型类型: <class 'NoneType'>
核心原理
__orig_class__:PEP 695泛型类的实例会携带该属性,指向创建实例时的具体泛型绑定(如Test[int]),而非未绑定的Test类本身。typing.get_args:专门用于解析泛型类型的参数,传入instance.__orig_class__后,会返回包含实际类型的元组,这里取第一个元素就是泛型参数T的实际类型。
边界情况处理
- 当泛型参数为
None时,get_args返回的是(NoneType,),对应Python中None的原生类型。 - 若泛型类包含多个类型参数,只需调整
get_args返回元组的索引即可(如get_args(...)[1]获取第二个参数)。
替代思路(直接操作泛型类)
如果需要直接从泛型类(而非实例)获取类型参数,可直接对绑定后的类调用get_args:
test_str_cls = Test[str] print(get_args(test_str_cls)[0]) # 输出:<class 'str'>
内容的提问来源于stack exchange,提问作者Rey Christian Eustaquio
相关产品推荐
相关产品推荐

