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

如何判断Pydantic模型中字段的类型是否为List类型?

如何检测Pydantic模型字段是否为List类型?

我正尝试将Pydantic模型自动转换为数据库模式,为此递归遍历模型的__fields__属性来判断字段类型。示例模型如下:

from typing import List
from pydantic import BaseModel

class TestModel(BaseModel):
    tags: List[str]

通过type(TestModel).__fields__['tags']可得到ModelField(name='tags', type=List[str], required=True),我想通过代码检测该ModelField的类型是否以List为原始类型,但尝试以下方法均不生效:

  • type(TestModel).__fields__['tags'].type_ is List[str]
  • type(TestModel).__fields__['tags'].type_ == List[str]
  • typing.get_origin(type(TestModel).__fields__['tags'].type_) is List
  • typing.get_origin(type(TestModel).__fields__['tags'].type_) == List

但type(TestModel).__fields__['tags'].type_ is str却返回True,请问正确的判断字段是否为List类型的方法是什么?


正确检测方案

问题出在Pydantic对泛型类型的封装逻辑上:在Pydantic v1中,ModelField的type_属性指向的是泛型的内部元素类型(比如List[str]里的str),而非完整的泛型类型,这也是你之前判断失败、且type_ is str返回True的核心原因。以下是适配不同Pydantic版本的解决方法:

Pydantic v1 版本

使用outer_type_获取完整的泛型类型,再结合typing模块的get_origin判断:

from typing import List, get_origin
from pydantic import BaseModel

class TestModel(BaseModel):
    tags: List[str]

field = TestModel.__fields__['tags']
# 获取泛型的原始类型
origin = get_origin(field.outer_type_)
# 判断是否为List(兼容Python内置list和typing.List)
if origin in (List, list):
    print("该字段是List类型")

Pydantic v2 版本

v2中推荐使用model_fields替代__fields__,可通过字段的annotation属性结合get_origin判断,或使用Pydantic自带的类型检查工具:

from typing import List, get_origin
from pydantic import BaseModel, is_instance_of

class TestModel(BaseModel):
    tags: List[str]

field = TestModel.model_fields['tags']
# 方法1:用get_origin判断泛型原始类型
origin = get_origin(field.annotation)
if origin in (List, list):
    print("该字段是List类型")

# 方法2:使用Pydantic内置工具
if is_instance_of(field.annotation, List):
    print("该字段是List类型")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 14:40:16