动态创建Python Pydantic类时如何为字段设置类型提示
解决方法
Pydantic 优先读取类的__annotations__属性获取字段类型,你原代码动态创建类时没有给my_field添加类型注解,Pydantic 会自动根据你传入的默认值"test"的字符串类型,推断字段类型为string,传入Field的type='int'参数不会覆盖这个自动推断的结果。
方案1:使用原生type创建时补充注解
直接在传入type的类属性字典中添加__annotations__字段,显式指定每个字段的类型:
from pydantic import BaseModel, Field, Extra from pprint import pprint class MyClass(BaseModel): class Config: extra = Extra.allow schema_extra = { '$id': "http://my-site.com/production.json", '$schema': "https://json-schema.org/draft/2020-12/schema", 'title': 'pattern="^.+-.*"' } if __name__ == '__main__': cls_attrs = { '__doc__': 'class created by type', # 显式添加类型注解 '__annotations__': {'my_field': int}, # 默认值使用int类型,和注解匹配 'my_field': Field(123) } cls = type('A', (MyClass,), cls_attrs) p = cls() schema = p.schema() pprint(schema)
方案2:使用Pydantic官方提供的create_model方法(更推荐)
Pydantic 自带的动态创建类工具会自动处理注解关联,写法更简洁不易出错:
from pydantic import BaseModel, Field, Extra, create_model from pprint import pprint class MyClass(BaseModel): class Config: extra = Extra.allow schema_extra = { '$id': "http://my-site.com/production.json", '$schema': "https://json-schema.org/draft/2020-12/schema", 'title': 'pattern="^.+-.*"' } if __name__ == '__main__': cls = create_model( 'A', __base__=MyClass, __doc__='class created by type', # 字段定义格式:字段名=(类型, 默认值/Field对象) my_field=(int, Field(123)) ) p = cls() schema = p.schema() pprint(schema)
如果你需要保留默认值为字符串,同时字段支持int和string两种类型,可以把注解改成
Union[int, str],不要让类型和默认值类型不匹配,否则会触发Pydantic的校验错误。
内容的提问来源于stack exchange,提问作者SteveJ
相关产品推荐
相关产品推荐

