Pydantic 动态字段:使用和不使用 `@computed_field` 的对比指南

Pydantic 动态字段:使用和不使用 `@computed_field` 的对比指南

    • 安装 Pydantic
    • 不使用 `@computed_field` 的实现
      • 特性
    • 使用 `@computed_field` 的实现
      • 特性
    • 使用和不使用 `@computed_field` 的对比
    • 适用场景分析
      • 什么时候不需要 `@computed_field`?
      • 什么时候使用 `@computed_field`?
    • 总结

在数据建模时,我们经常需要定义动态字段,基于模型中其他字段计算出结果。
Pydantic 提供了一个专门的装饰器 @computed_field,用于声明这样的动态字段。但即使不使用 @computed_field,也能通过普通的 Python 属性实现类似的效果。

本文将通过两种实现方式的对比,帮助你理解何时选择 @computed_field,以及它的优势。


安装 Pydantic

确保已安装最新版本的 Pydantic:

pip install pydantic

不使用 @computed_field 的实现

我们可以通过普通的 Python @property 定义动态字段:

from pydantic import BaseModel, Fieldclass LLMUsageMetrics(BaseModel):"""LLM request usage metrics."""input_tokens: int = Field(0, description="Used input tokens by the request")output_tokens: int = Field(0, description="Used output tokens by the request")@propertydef total_tokens(self) -> int:"""Total tokens used by the request."""return self.input_tokens + self.output_tokens# 测试
metrics = LLMUsageMetrics(input_tokens=100, output_tokens=50)
print(metrics.total_tokens)  # 输出: 150

特性

  1. 动态计算: total_tokens 每次访问时都会重新计算值。
  2. 不会出现在序列化输出中: 默认情况下,@property 定义的字段不会包含在 .model_dump().model_dump_json() 输出中。
print(metrics.model_dump())
# 输出: {'input_tokens': 100, 'output_tokens': 50}  # 没有 total_tokens

如果想将其包含在输出中,可以手动在模型方法中添加逻辑。


使用 @computed_field 的实现

Pydantic 的 @computed_field 是专为动态字段设计的:

from pydantic import BaseModel, Field, computed_fieldclass LLMUsageMetrics(BaseModel):"""LLM request usage metrics."""input_tokens: int = Field(0, description="Used input tokens by the request")output_tokens: int = Field(0, description="Used output tokens by the request")@computed_field()@propertydef total_tokens(self) -> int:"""Total tokens used by the request."""return self.input_tokens + self.output_tokens# 测试
metrics = LLMUsageMetrics(input_tokens=100, output_tokens=50)
print(metrics.total_tokens)  # 输出: 150
print(metrics.model_dump())
# 输出: {'input_tokens': 100, 'output_tokens': 50, 'total_tokens': 150}

特性

  1. 动态计算:@property 一样,每次访问时都会重新计算值。
  2. 自动出现在序列化输出中: @computed_field 定义的字段会自动包含在 .model_dump().model_dump_json() 输出中。

使用和不使用 @computed_field 的对比

特性不使用 @computed_field使用 @computed_field
定义方式使用普通的 @property使用 @computed_field@property 结合
动态计算每次访问时动态计算每次访问时动态计算
序列化输出默认不包含在 .model_dump().model_dump_json()自动包含在 .model_dump().model_dump_json()
使用场景需要简单动态字段,但不需要出现在序列化输出中需要动态字段且希望在序列化中体现
额外配置选项不支持支持 include_in_schema 等选项控制序列化行为

适用场景分析

什么时候不需要 @computed_field

  1. 只读属性: 如果动态字段只是为了在代码中访问,而不需要序列化输出。
  2. 灵活控制输出逻辑: 通过覆盖 .model_dump() 方法手动添加动态字段。

例如:

class LLMUsageMetrics(BaseModel):input_tokens: int = Field(0)output_tokens: int = Field(0)@propertydef total_tokens(self) -> int:return self.input_tokens + self.output_tokensdef model_dump(self, *args, **kwargs):base_dict = super().model_dump(*args, **kwargs)base_dict['total_tokens'] = self.total_tokensreturn base_dictmetrics = LLMUsageMetrics(input_tokens=100, output_tokens=50)
print(metrics.model_dump())
# 输出: {'input_tokens': 100, 'output_tokens': 50, 'total_tokens': 150}

什么时候使用 @computed_field

  1. 自动序列化输出: 动态字段需要出现在 .model_dump().model_dump_json() 输出中。
  2. 清晰的字段文档: @computed_field 支持额外的配置选项,如 descriptioninclude_in_schema,提升可读性和可维护性。

总结

  1. 不使用 @computed_field 可以满足简单的动态字段需求,但需要手动处理序列化输出逻辑。
  2. 使用 @computed_field 能自动包含动态字段到序列化输出中,且提供更多配置选项,适合更复杂的场景。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/63467.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Docker Engine多平台镜像构建(ARM64、x64、riscv64...)

Docker Engine多平台镜像构建(ARM64、x64、riscv64…) 1. Docker Engine安装 设置 Docker 的存储库# Add Dockers official GPG key: sudo apt-get update sudo apt-get install ca-certificates curl sudo install -m 0755 -d /etc/apt/keyrings sudo curl -fsSL https://do…

连续大涨,汉王科技跑步进入AI应用舒适区

OpenAI正在进行的“12天12场直播”让行业再次沸腾,二级市场也在寻找AI应用的机会。这刺激了12月首周同花顺sora概念涨超11%,远超同期大盘指数涨幅。 截至目前,“满血版”推理模型o1和月收费高达200美元的ChatGPT Pro订阅服务&…

[MySQL基础](三)SQL--图形化界面+DML

本专栏内容为:MySQL学习专栏 💓博主csdn个人主页:小小unicorn ⏩专栏分类:MySql 🚚代码仓库:小小unicorn的代码仓库🚚 🌹🌹🌹关注我带你学习编程知识 目录 图…

基于单片机的智能灯光控制系统

摘要 现在的大部分的大学,都是采用了一种“绿色”的教学方式,再加上现在的大学生缺乏环保意识,所以在学校里很多的教室,在白天的时候灯都会打开,这是一种极大的浪费,而且随时都有可能看到,这是…

数据分析及应用:滴滴出行打车日志数据分析

目录 0 日志数据集介绍 1 构建数据仓库 1.1 ods创建用户打车订单表 1.2 创建分区 1.3 上传到对应分区

解决Windows与Ubuntu云服务器无法通过Socket(udp)通信问题

今天在写Socket通信代码的时候,使用云服务器自己与自己通信没有问题,但是当我们把客户端换为Windows系统的时候却无法发送信息到Linux当中,耗时一上午终于搞定了😒。 问题: 如上图,当我在windows的客户端…

网络安全基本命令

网络安全基本命令 想学会网络安全,就必须学会基本的网络常用命令,才能更好的去掌握网络,保护自己的系统,防止入侵。我们必须学会的基本的网络命令主要是基于Windows NT平台下的基本命令,也就是说windows 98/windows ME的下部分命令是不能运行的。所以说&…

帝可得-运营管理App

运营管理App Android模拟器 本项目的App客户端部分已经由前端团队进行开发完成,并且以apk的方式提供出来,供我们测试使用,如果要运行apk,需要先安装安卓的模拟器。 可以选择国内的安卓模拟器产品,比如:网…

Android显示系统(07)- OpenGL ES - 纹理Texture

Android显示系统(02)- OpenGL ES - 概述 Android显示系统(03)- OpenGL ES - GLSurfaceView的使用 Android显示系统(04)- OpenGL ES - Shader绘制三角形 Android显示系统(05)- OpenGL…

二十万分之一几率:if语句变do-while卡死问题分析

背景 某次灰度发布之后没多久就收到线上ANR告警,经排查定位到是某个页面onCreate方法执行太久导致,而火焰图中的耗时堆栈指向了我们用于监控页面启动速度的一段插桩代码,反编译Apk之后发现本该是if语句的代码竟变成了一个do-while语句&#…

React v19稳定版发布12.5

🤖 作者简介:水煮白菜王 ,一位资深前端劝退师 👻 👀 文章专栏: 前端专栏 ,记录一下平时在博客写作中,总结出的一些开发技巧✍。 感谢支持💕💕💕 目…

Android笔记【17】返回数据的两种方法

目录 一、问题 二、具体分析 1、代码 2、区别 1. 目的和使用场景 resultLauncher startActivity 2. 数据传递方式 3. 返回结果的管理 4. 代码示例对比 使用 resultLauncher 启动活动并处理返回结果: 使用 startActivity 启动活动(不处理返回&…

flutter修改状态栏学习

在flutter中如何动态更改状态栏的颜色和风格。 前置知识点学习 AnnotatedRegion AnnotatedRegion 是 Flutter 中的一个小部件,用于在特定区域中提供元数据(metadata)以影响某些系统级的行为或外观。它通常用于改变系统 UI 的外观&#xff…

功能篇:JAVA使用jwt

在Java中实现JWT(JSON Web Token)认证通常涉及以下几个步骤: 1. 添加依赖 2. 创建JWT工具类 3. 实现登录接口,生成JWT 4. 实现过滤器,验证JWT ### 1. 添加依赖 首先,你需要在项目中添加JWT库的依赖。如果…

Chrome扩展程序开发示例

项目文件夹内文件如下: manifest.json文件内容: {"manifest_version": 3,"name": "我的法宝","description": "我的有魔法的宝贝","version": "1.0","icons": {"…

前端知识1html

VScode一些快捷键 Ctrl/——注释 !——生成html框架元素 *n——生成n个标签 直接书写html的名字回车生成对应的标签 常见标签 span&#xff1a; <span style"color: red;">hello</span> <span>demo</span> span实现&#xff1a; 标题…

计算机键盘简史 | 键盘按键功能和指法

注&#xff1a;本篇为 “计算机键盘简史 | 键盘按键功能和指法” 相关文章合辑。 英文部分机翻未校。 The Evolution of Keyboards: From Typewriters to Tech Marvels 键盘的演变&#xff1a;从打字机到技术奇迹 Introduction 介绍 The keyboard has journeyed from a humb…

mongoDb的读session和写session权限报错问题

go在使用mongoDb时用到了全局会话&#xff0c;发现在创建的session的逻辑相同&#xff0c;首先会进行数据的查询&#xff0c;此时获取了全局session执行读操作&#xff0c;查询所有文档&#xff0c;则当前会话为读会话&#xff0c;当再去插入时发现会报错&#xff0c;此时sessi…

【C++】求第二大的数详细解析

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 &#x1f4af;前言&#x1f4af;题目描述&#x1f4af;输入描述&#x1f4af;解题思路分析1. 题目核心要求2. 代码实现与解析3. 核心逻辑逐步解析定义并初始化变量遍历并处理输入数据更新最大值与次大值输…

redis-stack redisSearch环境安装搭建

RedisSearch在redis许可证变更之后显得是redis中的一大特色&#xff0c;闲来无事学习记录一下。 尝试通过源码编译redisSearch&#xff0c;貌似非常费劲&#xff0c;所以建议使用docker或者Linux的发行包进行安装redis-stack。redis-stack是基于redis的模块化机制进行一个扩展…