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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 00:38:11