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

如何正确检查Pydantic FieldInfo的类型?

Pydantic FieldInfo类型判断结果解析

先拆解你代码里三个判断的逻辑,解释实际输出和预期不符的原因:

1. isinstance(field_info.annotation, str) 返回False的原因

field_info.annotation存储的是类型对象(比如str、Address类),而不是字符串实例。str本身是type的实例,并不是str类型的实例——只有像"hello"这种具体的字符串才是str的实例。所以isinstance(str, str)必然返回False,你的预期错误是把「类型对象str」和「字符串实例」搞混了。

2. isinstance(field_info.annotation, type(str)) 对两个字段都返回True的原因

type(str)的结果是type(Python里所有类都是type的实例,包括内置类型和自定义类)。不管是str还是你定义的Address类,它们本质都是type的实例,所以这个判断对两个字段都会返回True。你预期第二个字段返回False,是误解了type(str)的含义——它不是指str类型,而是指所有类的元类型type。

3. field_info.annotation == str 的结果是正确的

这个是直接比较类型是否完全相等,name字段的annotation就是str,所以返回True;address的annotation是自定义的Address类,所以返回False,这个结果符合逻辑。

正确的类型判断方式

如果你想检查字段的类型是否是str,直接用类型相等判断即可:

def is_string(field_info: FieldInfo):
    print(f'checking field_info: {field_info}')
    # 正确判断字段类型是否为str
    print(field_info.annotation is str)
    # 判断是否为自定义类Address
    print(field_info.annotation is Address)
    # 通用判断是否为某个类型
    print(field_info.annotation == str)

运行后输出会符合你的预期逻辑:

checking field_info: annotation=str required=True
True
False
True
checking field_info: annotation=Address required=True
False
True
False

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 08:12:11