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

如何获取Python 3.7中Pydantic模型的所有Optional字段?

获取Pydantic模型中Optional类型的字段名

不需要使用inspect库,Pydantic本身提供了直接访问字段元数据的方式,能轻松筛选出Optional类型的字段。以下是实现方法:

方法思路

Optional[T]本质是Union[T, None]的别名,因此只需检查字段的类型注解是否为包含None的Union类型即可。通过模型的__fields__属性可以获取所有字段的详细信息,包括类型注解。

代码实现

兼容Python 3.7的版本

from pydantic import BaseModel
from typing import Optional, Union
from typing import get_origin, get_args

class Foo(BaseModel): 
    a: int 
    b: Optional[int]
    c: Optional[int]

def get_optional_fields(model_cls):
    optional_fields = []
    for field_name, field in model_cls.__fields__.items():
        field_type = field.outer_type_
        # 判断是否为Union类型,且参数包含None
        if get_origin(field_type) is Union and type(None) in get_args(field_type):
            optional_fields.append(field_name)
    return optional_fields

# 测试调用
print(get_optional_fields(Foo))  # 输出: ['b', 'c']

另一种直接判断方式

如果不想用get_origin和get_args,也可以直接检查字段类型的结构:

from types import NoneType

def get_optional_fields(model_cls):
    optional_fields = []
    for field_name, field in model_cls.__fields__.items():
        field_type = field.outer_type_
        if (isinstance(field_type, type(Union)) 
            and NoneType in field_type.__args__):
            optional_fields.append(field_name)
    return optional_fields

代码说明

  • model_cls.__fields__:返回一个有序字典,键是字段名称,值是ModelField对象,包含字段的类型、验证规则等元数据。
  • field.outer_type_:获取字段的原始类型注解(如Optional[int]对应的Union[int, None])。
  • get_origin(field_type):获取泛型类型的原始类(如Union),get_args(field_type)获取泛型的参数列表(如(int, None))。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 14:42:36