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

动态创建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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 08:54:10