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

Python中如何检查嵌套对象的详细类型并与typing注解匹配

在Python中获取带泛型参数的类型并与typing注解比较

Python内置的type()函数只能返回容器的顶层类型(比如list),这是因为Python遵循PEP 484的类型擦除机制:泛型注解信息不会保留在运行时的实例对象上。要实现你需要的泛型类型推断和比较,可以参考以下方法:

方法一:手动实现泛型类型推断

你可以编写一个递归函数,推断容器内元素的类型,再构造对应的typing模块泛型类型:

from typing import List, Tuple, Dict, Any

def infer_generic_type(obj):
    obj_cls = type(obj)
    # 处理列表类型
    if obj_cls is list:
        if not obj:
            return List[Any]
        # 假设列表元素类型一致,可根据需求调整异构元素逻辑
        elem_cls = type(obj[0])
        for item in obj:
            if type(item) != elem_cls:
                return List[Any]
        return List[elem_cls]
    # 处理元组类型
    elif obj_cls is tuple:
        if not obj:
            return Tuple[()]
        elem_clses = tuple(type(item) for item in obj)
        return Tuple[elem_clses]
    # 处理字典类型
    elif obj_cls is dict:
        if not obj:
            return Dict[Any, Any]
        key_cls = type(next(iter(obj.keys())))
        val_cls = type(next(iter(obj.values())))
        for k, v in obj.items():
            if type(k) != key_cls or type(v) != val_cls:
                return Dict[Any, Any]
        return Dict[key_cls, val_cls]
    # 非容器类型直接返回原类型
    else:
        return obj_cls

# 测试示例
nums = [1, 2, 3, 4]
print(infer_generic_type(nums))  # 输出: typing.List[int]
print(infer_generic_type(nums) == List[int])  # 输出: True

empty_list = []
print(infer_generic_type(empty_list))  # 输出: typing.List[Any]

方法二:使用第三方库简化操作

如果不想手动实现,可以借助第三方库来完成类型推断与验证:

用pydantic推断类型

pydantic的infer_type函数可以直接返回符合typing风格的类型字符串,TypeAdapter则可以验证对象是否匹配目标泛型类型:

from pydantic import infer_type, TypeAdapter
from typing import List

nums = [1, 2, 3, 4]
# 推断类型
print(infer_type(nums))  # 输出: list[int]
# 验证是否匹配List[int]
adapter = TypeAdapter(List[int])
adapter.validate_python(nums)  # 验证通过无报错,不匹配则抛出ValidationError

用typeguard做类型检查

typeguard的check_type函数可以直接验证对象是否符合目标泛型类型:

from typeguard import check_type
from typing import List

nums = [1, 2, 3, 4]
try:
    check_type(nums, List[int])
    print("类型匹配")
except TypeError:
    print("类型不匹配")

关键注意点

  1. 直接用type([1,2,3]) == List[int]永远返回False:type()返回的是原始的list类,而List[int]是泛型别名,二者不是同一对象。
  2. 运行时推断有局限性:如果容器包含异构元素,只能推断为Any;空容器无法确定具体元素类型,只能返回List[Any]这类模糊类型。

内容的提问来源于stack exchange,提问作者error 1044

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 05:17:14