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

能否在Pydantic模型中用常量名定义字段后通过常量值引用字段

Pydantic模型用常量值作为字段名的实现方法

你原本的写法无法实现目标需求:直接将常量名作为类属性声明,Pydantic会把常量名本身(也就是字符串COLUMN_MEAN)识别为字段名,实例化时只能传COLUMN_MEAN=2.1才能匹配,无法直接用常量对应的值mean传参。

你可以用以下两种方案实现需求:

方案1:使用create_model动态生成模型(最简洁)

create_model方法支持传入字典定义字段,字典的键就可以直接用常量的取值,实现你要的效果:

from pydantic import BaseModel, create_model

COLUMN_MEAN = "mean"
COLUMN_LENGTH = "length"

# 动态生成Item模型
Item = create_model(
    "Item",
    **{
        COLUMN_MEAN: (float, ...), # ...表示该字段为必填项
        COLUMN_LENGTH: (int, ...)
    }
)

使用方式完全符合你的要求:

# 实例化正常运行
item = Item(mean=2.1, length=10)
# 取值两种方式都支持
print(item.mean) # 输出 2.1
print(getattr(item, COLUMN_MEAN)) # 用常量取值也输出2.1

方案2:手动给类注解赋值

如果你不想用动态生成模型的方法,也可以先声明空的BaseModel子类,再手动给__annotations__属性添加字段:

from pydantic import BaseModel

COLUMN_MEAN = "mean"
COLUMN_LENGTH = "length"

class Item(BaseModel):
    pass

# 动态添加字段注解
Item.__annotations__[COLUMN_MEAN] = float
Item.__annotations__[COLUMN_LENGTH] = int

使用效果和方案1完全一致,实例化、取值都可以按照你预期的方式运行。

以上两种方案在Pydantic V1和V2版本中都可以正常使用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.10 03:48:03