Python类型注解:如何从容器泛型中提取内部实际类型?
实现代码
所有参数化后的泛型类型都会把传入的类型参数按顺序存储在__args__元组属性中,直接读取该属性即可提取内部类型,实现代码如下:
from typing import Any, get_origin def foo(generic_type: Any) -> Any: # 校验是否为合法的参数化泛型 if get_origin(generic_type) is None: raise TypeError(f"输入 {generic_type} 不是参数化的泛型类型") # 返回第一个泛型参数 return generic_type.__args__[0]
验证测试
用你给出的示例测试,输出符合预期:
from typing import List a = List[int] print(foo(a) == int) # 输出 True
补充说明
get_origin是Python 3.8+ typing模块内置的工具函数,如果你需要兼容更早版本,可以替换为直接判断__args__属性的存在性:
def foo(generic_type: Any) -> Any: if not hasattr(generic_type, "__args__") or len(generic_type.__args__) == 0: raise TypeError(f"输入 {generic_type} 不是参数化的泛型类型") return generic_type.__args__[0]
- 该实现也支持其他泛型的参数提取,比如
foo(Dict[str, int])会返回str,需要提取第二个参数的话取__args__[1]即可。
内容的提问来源于stack exchange,提问作者Richard
相关产品推荐
相关产品推荐

