如何判断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 Listtyping.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
相关产品推荐
相关产品推荐

