TypedDict 解析
TypedDict 解析
文章目录
- TypedDict 解析
- 1. 类型安全性
- 2. 可读性
- 3. 可维护性
- `TypedDict` 的解决方案
- 没有 `TypedDict` 会发生什么?
- 使用 `TypedDict` 的优势
- `TypedDict` 应用场景
- 1. 配置文件解析
- 2. API 数据解析
- 3. 数据库记录表示
- 4. 表单数据验证
- 5. 大型团队协作
- 6. 静态类型检查
- 结论
- 结论
TypedDict 是 Python 3.8 引入的一种类型提示工具,旨在解决以下几个问题:
1. 类型安全性
传统的 Python 字典在使用时没有类型检查,容易出现类型错误。比如,一个字典可能包含不同类型的数据,如果不小心将错误类型的数据存入字典中,代码在运行时可能会崩溃,导致难以调试的问题。
2. 可读性
在没有明确类型定义的情况下,其他开发者需要通过阅读大量上下文代码才能理解字典的结构和预期用途。这不仅费时费力,还增加了误解的风险。
3. 可维护性
随着代码的复杂度增加,管理和维护没有明确结构的字典变得越来越困难,容易引入错误,特别是在大型项目中。
TypedDict 的解决方案
TypedDict 提供了一种方法来定义字典的结构,使得代码在类型检查时更安全和可读。通过明确声明字典中每个键的名称和类型,可以显著提高代码的可维护性和可读性。
没有 TypedDict 会发生什么?
如果没有 TypedDict,开发者通常会遇到以下问题:
-
类型不安全
没有类型检查的字典容易导致类型错误。例如:movie_example = {"title": "Inception","year": 2010,"director": "Christopher Nolan" }movie_example["year"] = "2010" # 没有类型检查,可能导致运行时错误 -
难以理解的代码
字典结构不明确,其他开发者需要通过阅读大量上下文代码才能理解字典的预期结构和用途。例如:def print_movie(movie):print(f"Title: {movie['title']}")print(f"Year: {movie['year']}")print(f"Director: {movie.get('director', 'Unknown')}")# 调用函数时需要确保字典结构正确 movie_example = {"title": "Inception","year": 2010,"director": "Christopher Nolan" } print_movie(movie_example) -
难以维护
随着项目规模增大,维护没有明确结构的字典变得越来越困难。任何对字典结构的修改都需要逐个检查相关代码,容易引入错误。
使用 TypedDict 的优势
-
类型安全性
使用TypedDict可以显式地指定字典中每个键的类型,防止类型错误。from typing import TypedDictclass Movie(TypedDict):title: stryear: intdirector: strmovie_example: Movie = {"title": "Inception","year": 2010,"director": "Christopher Nolan" }# 如果尝试赋值错误类型的值,类型检查工具(如 mypy)会报错 # movie_example["year"] = "2010" # 错误: year 应该是 int 类型 -
可读性高
TypedDict提供的明确结构定义,使代码更具自文档性,其他开发者可以轻松理解字典的预期结构和用途。from typing import TypedDictclass Movie(TypedDict):title: stryear: intdirector: strdef print_movie(movie: Movie):print(f"Title: {movie['title']}")print(f"Year: {movie['year']}")print(f"Director: {movie.get('director', 'Unknown')}")movie_example: Movie = {"title": "Inception","year": 2010,"director": "Christopher Nolan" } print_movie(movie_example) -
易于维护
TypedDict的类型定义约束使得字典结构更容易管理和维护,特别是在大型项目中。 -
实例
pycharm中使用TypedDict,当字典出现错误的类型时,可以进行提示(在vscode中没有看到)。

TypedDict 应用场景
1. 配置文件解析
如果你的应用需要读取和解析复杂的配置文件(例如 JSON 或 YAML 格式),可以使用 TypedDict 来定义配置文件的结构。这样可以确保在解析配置文件时,数据的类型是正确的,并且在使用配置数据时有明确的类型提示。
from typing import TypedDictclass AppConfig(TypedDict):host: strport: intdebug: boolconfig: AppConfig = {"host": "localhost","port": 8080,"debug": True
}
2. API 数据解析
在处理外部 API 返回的数据时,使用 TypedDict 可以定义返回数据的结构,确保数据的类型和字段是正确的。这在处理复杂的 JSON 响应时尤为重要。
from typing import TypedDict, Listclass User(TypedDict):id: intname: stremail: strclass ApiResponse(TypedDict):users: List[User]total: intresponse: ApiResponse = {"users": [{"id": 1, "name": "Alice", "email": "alice@example.com"},{"id": 2, "name": "Bob", "email": "bob@example.com"}],"total": 2
}
3. 数据库记录表示
在处理数据库记录时,可以使用 TypedDict 来定义表结构。这不仅可以确保在查询数据库时返回的数据类型正确,还可以提高代码的可读性和可维护性。
from typing import TypedDictclass UserRecord(TypedDict):id: intname: stremail: strdef get_user_by_id(user_id: int) -> UserRecord:# 假设我们从数据库中获取数据return {"id": user_id, "name": "Alice", "email": "alice@example.com"}
4. 表单数据验证
在处理 web 表单数据时,可以使用 TypedDict 来定义表单数据的结构,并在处理表单数据时进行类型检查。这有助于确保表单数据的类型正确,并且简化数据验证过程。
from typing import TypedDict, Optionalclass RegistrationForm(TypedDict):username: strpassword: stremail: Optional[str]def process_registration_form(data: RegistrationForm):# 处理注册表单数据print(data["username"])print(data["password"])print(data.get("email"))
5. 大型团队协作
在大型团队协作开发中,使用 TypedDict 可以明确数据结构,减少沟通成本和误解,提高代码质量和可维护性。每个团队成员都可以轻松理解和使用 TypedDict 定义的数据结构。
6. 静态类型检查
使用 TypedDict 可以结合静态类型检查工具(如 mypy)进行类型检查,捕获潜在的类型错误,提高代码的可靠性和安全性。
from typing import TypedDict, Optionalclass Movie(TypedDict):title: stryear: intdirector: Optional[str]movie_example: Movie = {"title": "Inception","year": 2010,"director": "Christopher Nolan"
}# 如果尝试赋值错误类型的值,类型检查工具(如 mypy)会报错
# movie_example["year"] = "2010" # 错误: year 应该是 int 类型
结论
TypedDict 在需要明确定义数据结构的场景下非常有用,特别是在处理配置文件、API 数据、数据库记录、表单数据以及大型团队协作开发时。它通过提供类型安全性和明确的数据结构定义,提高了代码的可读性、可维护性和可靠性。
结论
TypedDict 是一种强大的工具,解决了传统字典缺乏类型安全性、可读性和可维护性的问题。通过明确定义字典的结构,TypedDict 提高了代码的安全性、可读性和可维护性,是现代 Python 开发中推荐的做法。
相关文章:
TypedDict 解析
TypedDict 解析 文章目录 TypedDict 解析1. 类型安全性2. 可读性3. 可维护性TypedDict 的解决方案没有 TypedDict 会发生什么?使用 TypedDict 的优势 TypedDict 应用场景1. 配置文件解析2. API 数据解析3. 数据库记录表示4. 表单数据验证5. 大型团队协作6. 静态类型…...
Windows11和Ubuntu22双系统安装指南
一、需求描述 台式机电脑,已有Windows11操作系统,想要安装Ubuntu22系统(版本任意)。其中Windows安装在Nvme固态上,Ubuntu安装在Sata固态上,双盘双系统。开机时使用Grub控制进入哪个系统,效果图…...
Dockerfile-php7.4.33
# 使用一个包含基本编译工具的基础镜像 FROM ubuntu:latestRUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \echo "Asia/Shanghai" > /etc/timezone# 更新包列表并安装必要的编译工具和库 RUN apt-get update && apt-get i…...
如何降低MCU系统功耗?
大家在做MCU系统开发的时候,是否也碰到过降低MCU系统功耗的需求? MCU系统整板功耗是个综合的数据,包括MCU功耗以及外部器件功耗,在此我们主要介绍如何降低MCU的功耗: 可以在满足应用的前提下,降低MCU的运…...
移动端 UI 风格,诠释精致
移动端 UI 风格,诠释精致...
【408考点之数据结构】数组和特殊矩阵的压缩存储
数组和特殊矩阵的压缩存储 在数据结构中,数组是一种基础的数据结构,用于存储相同类型的元素的集合。矩阵则是一个二维数组,常用于表示图像、图形以及数学运算中的系数。随着矩阵的广泛应用,一些特殊类型的矩阵也被引入并得到了有…...
26、matlab多项式曲线拟合:polyfit ()函数
1、前言 在 MATLAB 中,可以使用 polyfit() 函数进行多项式曲线拟合。polyfit() 函数可以拟合一个多项式模型到给定的数据点,从而找到最符合这些数据点的多项式曲线。以下是关于 polyfit() 函数的一些基本说明和示例用法: 语法 p = polyfit(x, y, n) x 和 y 是数据点的横纵…...
VMR,支持30+种编程语言的SDK版本管理器,支持Windows/MacOS/Linux。
官方文档地址:https://docs.vmr.us.kg/ 欢迎安装使用,分享转发,前往github star。 跨平台,支持Windows,Linux,MacOS支持多种语言和工具,省心受到lazygit的启发,拥有更友好的TUI&…...
模板初阶【C++】
文章目录 模板的作用模板的原理模板分为两大类——函数模板和类模板函数模板语法函数模板实例化模板函数的方式模板函数的类型转换既有函数模板又有已经实现的函数,会优先调用哪一个? 类模板语法模板类实例化对象模板类的模板参数可以有缺省值类模板中的…...
搭建Vue的环境
目录 # 开篇 步骤一,准备Vue 的环境 步骤二,下载Vue.js的包 步骤三,创建并打开写前端代码的文件夹 步骤四,在VSCode中引入Vue.js的包 步骤五,创建第一个vue.html Vue其他知识 Vue.config命令 # 开篇 介绍&…...
[学习笔记]-MyBatis-Plus简介
简介 Mybatis-Plus(简称 MP)是一个 MyBatis (opens new window)的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。 简言之就是对单表的增删改查有了很好的封装。基本不用再单独写sql语句了。目前此类…...
2024.6.23 刷题总结
2024.6.23 **每日一题** 520.检测大写字母,本题是简单模拟题,考察了ASCLL码相关的知识,根据题意,本题对于字符串有三种正确的用法,所以我们分三类来讨论,先根据首字母的大小写来分类,如果首字母…...
mysql查询不同用户(操作记录)的最新一条记录
先用MAX(time) 和 group by item_id 查询出不同的item_id对应的最大时间,然后再在外面连表查询,查询 表中 item_id 和login_time 时间 相等于刚才的查询记录的记录 具体语句如下 select a.* from reyo a join (select item_id,max(login_time) as ti…...
Java中如何使用设计模式来解决编程问题?
Java中使用设计模式来解决编程问题,可以显著提高代码的可复用性、可维护性和可读性。设计模式是一套被广泛应用于软件工程的解决方案,描述了在特定上下文中面对具体问题时的可复用解决方案。以下是几种常用的设计模式及其应用场景: 单例模式…...
单机、集群和分布式
目录 1.概述 2.单机服务器 单机版的服务器的性能,设计上的瓶颈? 3.集群 解决瓶颈1: 没有解决瓶颈2: 没有解决瓶颈3: 集群的优点? 集群的缺点? 4.分布式 分布式的优点? 分…...
qt开发-10_LineEdit
QLineEdit 小部件是一个单行文本编辑器。行编辑允许用户使用一组有用的编辑函数输入和 编辑一行纯文本。包括撤消和重做、剪切和粘贴以及拖放。通过更改行编辑的 echoMode(),它 还可以用作“只写”字段,用于输入如密码等. 创建好项目后,进入 …...
福昕PDF编辑器快速去除PDF水印方法
在福昕PDF编辑器软件中打开一个带有水印的PDF文件,点击如图下所示的页面管理->水印,点击全部移除 点击 是 水印消除(注:部分类型的水印可以消除,但是有些类型的水印无法通过此方法消除)...
Cloudflare 常用操作
一、域名托管到cloudflare 登录cloudflare->添加站点->填写域名(例如阿里云)->继续选择free套餐->继续->保存cloudflare分配的DNS地址->进入阿里云域名管理->进入DNS管理/DNS修改把DNS地址修改为cloudflare分配的两个DNS->保存->回到cloudflare->…...
elementUI的table使用展开功能( type=“expand“ ),展开时合起上一次展开的内容,始终保持展开内容为一个,并且再次点击合起自身
直接上代码了没什么可讲的,主要是用到 row-key"id" :expand-row-keys"expands row-click"handleRowClick" <template><div class"ele-body"><el-card shadow"never"><!-- 数据表格 --><ele-pro-t…...
【金】?Y? python网页前端streamlit
1、如何从 Google Colab Notebook 启动 streamit参考-How to Launch Streamlit App from Google Colab Notebook !streamlit run web.py & npx localtunnel --port 8501 & curl ipv4.icanhazip.com...
观成科技:隐蔽隧道工具Ligolo-ng加密流量分析
1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具,该工具基于TUN接口实现其功能,利用反向TCP/TLS连接建立一条隐蔽的通信信道,支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式,适应复杂网…...
国防科技大学计算机基础课程笔记02信息编码
1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制,因此这个了16进制的数据既可以翻译成为这个机器码,也可以翻译成为这个国标码,所以这个时候很容易会出现这个歧义的情况; 因此,我们的这个国…...
C++实现分布式网络通信框架RPC(3)--rpc调用端
目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中,我们已经大致实现了rpc服务端的各项功能代…...
循环冗余码校验CRC码 算法步骤+详细实例计算
通信过程:(白话解释) 我们将原始待发送的消息称为 M M M,依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)(意思就是 G ( x ) G(x) G(x) 是已知的)࿰…...
vscode(仍待补充)
写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh? debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...
(二)TensorRT-LLM | 模型导出(v0.20.0rc3)
0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述,后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作,其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...
华为OD机试-食堂供餐-二分法
import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...
【AI学习】三、AI算法中的向量
在人工智能(AI)算法中,向量(Vector)是一种将现实世界中的数据(如图像、文本、音频等)转化为计算机可处理的数值型特征表示的工具。它是连接人类认知(如语义、视觉特征)与…...
MySQL中【正则表达式】用法
MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现(两者等价),用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例: 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...
在WSL2的Ubuntu镜像中安装Docker
Docker官网链接: https://docs.docker.com/engine/install/ubuntu/ 1、运行以下命令卸载所有冲突的软件包: for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done2、设置Docker…...
