如何在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
相关产品推荐
相关产品推荐

