Pydantic中的discriminator:优雅地处理联合类型详解
Pydantic中的discriminator:优雅地处理联合类型详解
- 引言
- 1. 什么是discriminator?
- 2. 基本使用示例
- 3. discriminator的工作原理
- 4. 更复杂的实际应用场景
- 5. 使用建议
- 6. 潜在陷阱和注意事项
- 结论
- 最佳实践
引言
在Python的类型系统中,有时我们需要处理多种可能的类型,这就是所谓的联合类型。Pydantic提供了discriminator
参数,它可以帮助我们优雅地区分和验证这些不同的类型。今天,我们将深入探讨Field(discriminator="azure")
的使用方法和应用场景。
1. 什么是discriminator?
discriminator
是Pydantic中的一个强大特性,它允许我们根据特定字段的值自动选择正确的子类型。简单来说,它就像是一个"类型选择器"。
2. 基本使用示例
让我们通过一个具体的例子来理解discriminator
的工作原理:
from typing import Annotated, Union
from pydantic import BaseModel, Field# 公共OpenAI配置
class PublicOpenAIConfig(BaseModel):azure: bool = Falseapi_key: strbase_url: str = "https://api.openai.com/v1"# Azure OpenAI配置
class AzureOpenAIConfig(BaseModel):azure: bool = Trueapi_key: strendpoint: strdeployment_name: str# 使用discriminator定义联合类型
OpenAIConfig = Annotated[Union[PublicOpenAIConfig, AzureOpenAIConfig], Field(discriminator="azure")
]# 使用示例
def create_openai_config(is_azure: bool) -> OpenAIConfig:if is_azure:return AzureOpenAIConfig(api_key="azure-secret-key",endpoint="https://your-azure-endpoint.openai.azure.com/",deployment_name="your-deployment")else:return PublicOpenAIConfig(api_key="public-openai-key")# 演示不同配置的创建
public_config = create_openai_config(is_azure=False)
azure_config = create_openai_config(is_azure=True)print("Public Config:", public_config)
print("Azure Config:", azure_config)
3. discriminator的工作原理
在上面的例子中,discriminator="azure"
起到了以下关键作用:
- 根据
azure
字段的布尔值自动选择正确的配置类型 - 当
azure=False
时,使用PublicOpenAIConfig
- 当
azure=True
时,使用AzureOpenAIConfig
4. 更复杂的实际应用场景
from typing import Annotated, Union
from pydantic import BaseModel, Field# 不同类型的日志配置
class FileLogConfig(BaseModel):type: str = "file"filename: strmax_size: int = 10 * 1024 * 1024 # 10MBclass DatabaseLogConfig(BaseModel):type: str = "database"connection_string: strtable_name: strclass ConsoleLogConfig(BaseModel):type: str = "console"color: bool = True# 使用discriminator定义日志配置
LogConfig = Annotated[Union[FileLogConfig, DatabaseLogConfig, ConsoleLogConfig], Field(discriminator="type")
]def create_log_config(log_type: str) -> LogConfig:if log_type == "file":return FileLogConfig(filename="/var/log/app.log")elif log_type == "database":return DatabaseLogConfig(connection_string="postgresql://user:pass@localhost/logs",table_name="application_logs")elif log_type == "console":return ConsoleLogConfig()else:raise ValueError(f"Unsupported log type: {log_type}")# 演示不同日志配置
file_log = create_log_config("file")
db_log = create_log_config("database")
console_log = create_log_config("console")print("File Log Config:", file_log)
print("Database Log Config:", db_log)
print("Console Log Config:", console_log)
5. 使用建议
- 确保discriminator字段在所有子类型中都存在
- 字段值应该能唯一标识每个子类型
- 对于复杂的类型系统,discriminator是管理多态性的有效方法
6. 潜在陷阱和注意事项
- 所有子类型必须有一个公共的鉴别字段
- 鉴别字段的值必须能唯一区分不同的类型
- 在处理JSON或外部数据时特别有用
结论
Field(discriminator="xxx")
是Pydantic中处理联合类型的强大特性。它提供了一种优雅、类型安全的方式来处理不同配置或对象的变体,使代码更加清晰和可维护。
最佳实践
- 只在需要动态选择类型时使用
- 保持鉴别字段简单明了
- 考虑类型的扩展性和灵活性
希望这篇文章能帮助你更好地理解和使用Pydantic的discriminator特性!
相关文章:
Pydantic中的discriminator:优雅地处理联合类型详解
Pydantic中的discriminator:优雅地处理联合类型详解 引言1. 什么是discriminator?2. 基本使用示例3. discriminator的工作原理4. 更复杂的实际应用场景5. 使用建议6. 潜在陷阱和注意事项结论最佳实践 引言 在Python的类型系统中,有时我们需要…...
pgloader SQLSERVER -> PostgreSQL 配置文件样例
pgloader 是什么?安装和基本用户法可以去其他同道的blog上去看,这里不占用网络空间了。刚开始用官方的文档读起还是很费劲的,所以把常用的配置例子放在这里。 官方文档:https://pgloader.readthedocs.io/en/latest/index.html 迁…...
APP、小程序对接聚合广告平台,有哪些广告变现策略?
开发者对接聚合广告平台,可以让自身流量价值最大化,获得更多的广告曝光机会,对接单一的广告联盟容易造成广告填充不足,收益不稳定的问题。#APP广告变现# APP开发者根据应用的生命周期、用户特征和产品定位,选择最适合…...

HarmonyOs DevEco Studio小技巧39-模拟器的使用
使用环境 模拟器在本地计算机上创建和运行,在运行和调试应用/元服务时可以保持良好的流畅性和稳定性,但是需要耗费一定的计算机资源,具体的运行环境要求为: 系统类型 运行环境要求 Windows(X86) Windows 10 企业版、专业版或教…...

【C语言】浮点数的原理、整型如何转换成浮点数
众所周知C语言中浮点数占四个字节,无论在32位或者64位机器上。不免会发出疑问四个字节是怎么计算出小数的呢?其实物理存放还是按照整型存放的。 IEEE 754 单精度浮点数格式 浮点数在计算机中是使用 IEEE 754 标准进行表示的。在 IEEE 754 标准中&#…...

TesseractOCR-GUI:基于WPF/C#构建TesseractOCR简单易用的用户界面
前言 前篇文章使用Tesseract进行图片文字识别介绍了如何安装TesseractOCR与TesseractOCR的命令行使用。但在日常使用过程中,命令行使用还是不太方便的,因此今天介绍一下如何使用WPF/C#构建TesseractOCR简单易用的用户界面。 普通用户使用 参照上一篇教…...

Elasticsearch高性能实践
前言 本方案主要从运维层面分析es是实际生产使用过程中的参数优化,深入理解es各个名词及含义,深入分析es的使用过程中应注意的点,详细解释参数设置的原因以及目的,主要包括系统层面,参数层面。除此之外,优…...

软件测试--录制与回放脚本
准备工作 安装phpstudy 配置两个内容 放demo44文件夹 在浏览器输入http://localhost/demo44/index.html,出现如图所示的网站 输入用户名和密码 步骤一:打开Virtual User Generator,点击新建,点击new 步骤二:点击如下…...
nodejs 06.npm的使用以及package.json详解
一.npm(npm | Home)的介绍 npm(Node Package Manager)是一个node.js的包管理工具,允许用户下载安装更新分享node.js包 二.npm相关命令以及作用 1.npm init -y 这条命令主要是当项目中没有package.json这个文件的时候生成package.json这个文件 2.npm i / npm install (包名) 这条…...

如何使用WinCC DataMonitor基于Web发布浏览Excel报表文档
本文介绍使用 WinCC DataMonitor 的 "Excel Workbooks" 功能,通过 Excel 表格显示 WinCC 项目的过程值、归档变量值和报警归档消息。并可以通过 Web 发布浏览访问数据 1.WinCC DataMonitor是什么 ? DataMonitor 是 SIMATIC WinCC 工厂智能中…...

颜色的基本处理
数码相机能够获取彩色图像,但相机的色彩处理是一个非常复杂的过程,是非常重要的。 此过程生产制造商在细节方面都是不公布的,但是基本的概念是相同的。当相机捕捉一个真实场景时,是怎么还原成人眼所看到的图像呢? 1.R…...
跟李笑来学美式俚语(Most Common American Idioms): Part 66
Most Common American Idioms: Part 66 前言 本文是学习李笑来的Most Common American Idioms这本书的学习笔记,自用。 Github仓库链接:https://github.com/xiaolai/most-common-american-idioms 使用方法: 直接下载下来(或者clone到本地…...
爬虫技术简介
1、爬虫简介 爬虫(Web crawler)是一种用于自动获取网页内容的程序。它可以通过模拟浏览器访问网页,并从中提取所需的信息,如文本、图片、链接等。爬虫在互联网上进行广泛应用,用于搜索引擎的网页抓取、数据挖掘、信息收集、内容监测等领域。 2、爬虫分类 爬虫的分类有以…...

如何打开Windows10的设备管理器
如何打开Windows10的设备管理器? 01 02...
scala列表
1 不可变 List 说明 (1)List 默认为不可变集合 (2)创建一个 List(数据有顺序,可重复) (3)遍历 List (4)List 增加数据 (5&#…...
c++检查某一文件是否存在
C17及以上版本,检查文件是否存在可以使用filesystem库 如果使用的是C11或C14,标准库并没有直接提供这样的功能。 可以使用平台特定的API,例如在Windows上使用 _access 函数,或在POSIX兼容系统(如Linux和macOS&#x…...
Scala的隐式类,隐式参数和值,隐式对象
1.Scala的隐式类定义语法:implicit class 类名(参数){ } 隐式类中参数只能定义一个,参数中的源类型与目标类型一一对应,只能从一种类型转换成另一种类型,不可以一对多或多对。 //隐式类:implicit class隐式转换函…...
LabVIEW实现HTTP通信
目录 1、HTTP通信原理 2、硬件环境部署 3、云端环境部署 4、HTTP通信函数 5、程序架构 6、前面板设计 7、程序框图设计 本专栏以LabVIEW为开发平台,讲解物联网通信组网原理与开发方法,覆盖RS232、TCP、MQTT、蓝牙、Wi-Fi、NB-IoT等协议。 结合实际案例,展示如何利用LabVIEW和…...
【EXCEL】 获取多列中 不为空的那一个数据
从多个表格筛选出来的上班时间是下表这样的 我要把他们放在同一列,这样方便后续处理,合并列输入下面这个公式即可 日期不加 TEXT() 函数 转日期格式;将得到是一串数字 TEXT(TEXTJOIN(", ",TRUE,B2:F2),&qu…...

VBA API 概述 | 宏编程
注:本文为 “VBA API 概述 | 宏编程 | 执行速度慢” 相关文章合辑。 VBA API 详解 Office 二次开发于 2020-12-17 22:27:10 发布 Office 版本变动 在 Office 2010 之前,微软仅提供 32-bit 版本的 Office。而自 Office 2010 起,出现了 32-b…...
【网络】每天掌握一个Linux命令 - iftop
在Linux系统中,iftop是网络管理的得力助手,能实时监控网络流量、连接情况等,帮助排查网络异常。接下来从多方面详细介绍它。 目录 【网络】每天掌握一个Linux命令 - iftop工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景…...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)
HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...

Unity3D中Gfx.WaitForPresent优化方案
前言 在Unity中,Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染(即CPU被阻塞),这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案: 对惹,这里有一个游戏开发交流小组&…...

C++使用 new 来创建动态数组
问题: 不能使用变量定义数组大小 原因: 这是因为数组在内存中是连续存储的,编译器需要在编译阶段就确定数组的大小,以便正确地分配内存空间。如果允许使用变量来定义数组的大小,那么编译器就无法在编译时确定数组的大…...

Docker 本地安装 mysql 数据库
Docker: Accelerated Container Application Development 下载对应操作系统版本的 docker ;并安装。 基础操作不再赘述。 打开 macOS 终端,开始 docker 安装mysql之旅 第一步 docker search mysql 》〉docker search mysql NAME DE…...

UE5 音效系统
一.音效管理 音乐一般都是WAV,创建一个背景音乐类SoudClass,一个音效类SoundClass。所有的音乐都分为这两个类。再创建一个总音乐类,将上述两个作为它的子类。 接着我们创建一个音乐混合类SoundMix,将上述三个类翻入其中,通过它管理每个音乐…...
Easy Excel
Easy Excel 一、依赖引入二、基本使用1. 定义实体类(导入/导出共用)2. 写 Excel3. 读 Excel 三、常用注解说明(完整列表)四、进阶:自定义转换器(Converter) 其它自定义转换器没生效 Easy Excel在…...

英国云服务器上安装宝塔面板(BT Panel)
在英国云服务器上安装宝塔面板(BT Panel) 是完全可行的,尤其适合需要远程管理Linux服务器、快速部署网站、数据库、FTP、SSL证书等服务的用户。宝塔面板以其可视化操作界面和强大的功能广受国内用户欢迎,虽然官方主要面向中国大陆…...
Shell 解释器 bash 和 dash 区别
bash 和 dash 都是 Unix/Linux 系统中的 Shell 解释器,但它们在功能、语法和性能上有显著区别。以下是它们的详细对比: 1. 基本区别 特性bash (Bourne-Again SHell)dash (Debian Almquist SHell)来源G…...

(12)-Fiddler抓包-Fiddler设置IOS手机抓包
1.简介 Fiddler不但能截获各种浏览器发出的 HTTP 请求,也可以截获各种智能手机发出的HTTP/ HTTPS 请求。 Fiddler 能捕获Android 和 Windows Phone 等设备发出的 HTTP/HTTPS 请求。同理也可以截获iOS设备发出的请求,比如 iPhone、iPad 和 MacBook 等苹…...