如何正确检查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
相关产品推荐
相关产品推荐

