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

如何在PydanticBaseSettingsSource中正确判断字段为MyModel类型?

正确判断Pydantic字段类型为MyModel的方式

你当前的判断isinstance(field.annotation, MyModel)无效的原因是:field.annotation返回的是类对象(比如<class 'mymodule.MyModel'>),而isinstance是用来判断某个实例是否属于某个类的,所以这个判断永远会返回False。

基础场景:严格匹配MyModel类型

如果你的字段注解就是直接的MyModel(没有复合类型如Optional、Union),直接用is判断类对象是否一致即可:

class CustomSettingsSource(PydanticBaseSettingsSource):
    def get_field_value(
        self, field: FieldInfo, field_name: str
    ) -> Tuple[Any, str, bool]:
        return ({}, "", False)

    def __call__(self) -> Dict[str, Any]:
        d: Dict[str, Any] = {}

        for field_name, field in self.settings_cls.model_fields.items():
            # 正确判断字段类型为MyModel
            if field.annotation is MyModel:
                # 执行你的自定义处理逻辑
                # 示例:从配置源加载MyModel实例,或处理默认值
                d[field_name] = field.default
        return d

进阶场景:支持MyModel的子类

如果需要兼容MyModel的子类,使用issubclass,但要先确保注解是一个类(避免处理复合类型时报错):

import inspect

class CustomSettingsSource(PydanticBaseSettingsSource):
    def get_field_value(
        self, field: FieldInfo, field_name: str
    ) -> Tuple[Any, str, bool]:
        return ({}, "", False)

    def __call__(self) -> Dict[str, Any]:
        d: Dict[str, Any] = {}

        for field_name, field in self.settings_cls.model_fields.items():
            annotation = field.annotation
            # 判断是否是MyModel或其子类
            if inspect.isclass(annotation) and issubclass(annotation, MyModel):
                # 执行自定义处理逻辑
                d[field_name] = field.default
        return d

复杂场景:处理复合类型(如Optional[MyModel]、List[MyModel])

如果字段注解是复合类型,比如Optional[MyModel]或List[MyModel],可以用typing模块的get_origin和get_args解析类型:

from typing import get_origin, get_args

class CustomSettingsSource(PydanticBaseSettingsSource):
    def get_field_value(
        self, field: FieldInfo, field_name: str
    ) -> Tuple[Any, str, bool]:
        return ({}, "", False)

    def __call__(self) -> Dict[str, Any]:
        d: Dict[str, Any] = {}

        for field_name, field in self.settings_cls.model_fields.items():
            annotation = field.annotation
            origin = get_origin(annotation)
            
            # 处理Optional[MyModel](即Union[None, MyModel])
            if origin is Union:
                args = get_args(annotation)
                if any(inspect.isclass(arg) and issubclass(arg, MyModel) for arg in args):
                    # 执行处理逻辑
                    d[field_name] = field.default
            
            # 处理List[MyModel]
            elif origin is list:
                list_arg = get_args(annotation)[0]
                if inspect.isclass(list_arg) and issubclass(list_arg, MyModel):
                    # 执行处理逻辑
                    d[field_name] = field.default
        return d

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 00:24:59