快速弄懂Python3.11中的新特性

Python 3.11 引入了许多新特性和改进,让我们逐一详细了解这些更新:

1. 更详细的错误消息

Python 3.11 在错误报告方面做出了显著改进,与 Python 3.10 相比,它提供了更详细的错误消息,能够指出表达式中具体哪个部分导致了错误。

示例解析

假设我们有以下代码片段:

x = [1, 2, 3]
z = x[1][0]

在这个例子中,x 是一个包含整数的列表。当执行到 z = x[1][0] 这一行时,代码试图访问列表中第二个元素(整数 2)的第一个子元素。然而,这里的问题是整数(int 类型)是不可索引的,即不能像列表或数组那样访问其“子元素”。

在 Python 3.10 中的错误消息

在 Python 3.10 中,如果运行这段代码,你会得到类似以下的错误消息:

File "<filename>", line 2, in <module>z = x[1][0]
TypeError: 'int' object is not subscriptable

这个错误消息告诉我们两件事:

  1. 错误发生在文件的第 2 行。
  2. 引发的异常是 TypeError,原因是尝试对一个整数进行索引操作(“not subscriptable”)。

然而,这个错误消息并不指出是哪个具体的表达式部分导致了错误。

在 Python 3.11 中的错误消息

相比之下,Python 3.11 在这方面做出了显著改进。相同的代码在 Python 3.11 中会产生如下错误消息:

File "<filename>", line 2, in <module>z = x[1][0]~~~~^^^
TypeError: 'int' object is not subscriptable

注意这里的改进:

  • 错误消息不仅指出了问题发生的行号和基本原因,还通过 ~~~~^^^ 直接指向了具体的问题表达式。
  • 这个指示明确了 x[1][0] 中的 x[1] 部分(即整数 2)是不可索引的,而不是整个表达式。
结论

这种更详细的错误指示使得开发者能够快速准确地定位代码中的问题,特别是在处理复杂的表达式时。这不仅节省了调试时间,也提高了开发效率,特别对于新手或是处理大型代码库的开发者来说,这一改进是非常有价值的。

2. 改进异常处理

Python 3.11 中的异常处理机制得到了显著的改进,这些改进使得异常的处理更加灵活、高效,并且对开发者更加友好。下面是这些改进的详细分析:

多异常处理
  • except * 语法和 ExceptionGroup: 在 Python 3.11 中,引入了新的 except * 语法和 ExceptionGroup 异常类型。这允许在一个单独的 except 语句中捕获和处理多个异常。
  • 用途: 这对于并发或异步编程非常有用。在这些场景中,多个操作可能同时失败,并抛出不同的异常。使用 except * 语法,可以一次性处理这些异常,而不是逐一捕获和处理。
  • 例子: 如果你在一个异步操作中有多个任务同时运行,并且它们可能会抛出不同的异常,那么使用 except * 可以使得异常处理更简洁、更集中。
Zero-cost 异常
  • 性能优化: 在之前的 Python 版本中,即使异常没有被抛出,try/except 代码块的存在也会带来一定的性能开销。在 Python 3.11 中,除非异常真的被抛出,否则 try/except 代码块不会产生任何额外的成本。
  • 内存和速度: 这种改进意味着 try/except 代码块现在会使用更少的内存,并且执行得更快。
性能提升
  • 捕获异常时间减少: Python 3.11 中捕获异常所需的时间比以前减少了大约 10%。
  • 对开发者的影响: 这对于那些大量使用异常处理的应用程序来说是一个重要的改进,特别是在性能敏感的应用程序中。
异常注释
  • 上下文注释: Python 3.11 允许通过上下文注释来丰富异常。这意味着你可以为异常添加额外的信息,帮助开发者更好地理解异常发生的上下文。
  • 与异常文本分开: 这些注释与异常本身的文本是分开的,使得代码的可读性和维护性得到提升。
总结

这些改进显示了 Python 语言对于现代编程挑战的适应性,特别是在并发和异步编程方面。通过引入更灵活的异常处理机制、减少性能开销以及增强异常的表达性,Python 3.11 为开发者提供了更强大、更高效的工具来处理代码中的异常情况。

3. 类型提示的改进

自我类型 (typing.Self)
  • 概念: typing.Self 是一个特殊的类型提示,用于表示类方法返回的对象是其所属类的实例。
  • 用途: 这对于那些在类方法中返回自身实例的情况特别有用,如在构建链式调用(fluent interface)或者工厂方法时。
  • 优势: 在以前,这种类型的注释需要复杂和冗长的表达方式,typing.Self 使得这一过程简化,提高了代码的可读性并有助于静态类型检查器更准确地分析代码。
任意的字符串字面类型 (typing.LiteralString)
  • 概念: typing.LiteralString 是一种新的类型注解,它允许你指定一个变量必须是字面字符串(即源代码中直接定义的字符串)。
  • 应用: 这在需要确保字符串值不是经过程序计算或修改的情况下非常有用,比如在处理配置键、环境变量名或某些类型的API参数时。
  • 优势: 在以前的版本中,类型注解无法区分一个普通的字符串和一个字面字符串,typing.LiteralString 提供了这种区分的能力。
数据类转换 (typing.DataclassTransform)
  • 概念: typing.DataclassTransform 是一种装饰器,用于使得非数据类的行为类似于数据类。
  • 用途: 这对于那些遵循数据类模式但实际上并不是数据类的类非常有用,比如在某些ORM(对象关系映射)框架中。
  • 功能: 它允许使用类型注解来声明一个类或函数应该像数据类一样处理,即使它们本身并不是用 @dataclass 装饰的。
可变参数泛型 (TypeVarTuple)
  • 概念: TypeVarTuple 引入了可变参数泛型(variadic generics)的概念,允许在类型提示中使用一系列的类型,而不仅仅是一个单一类型。
  • 应用: 这在处理类似于数组或元组的结构时特别有用,比如在数学计算或科学计算库(如 NumPy)中。
  • 优势: 可变参数泛型提供了一种更灵活的方式来表示函数或类可以接受多种不同类型的参数,这有助于在这些情况下进行更准确的类型检查。
总结

这些类型提示的改进使得 Python 的静态类型检查更加强大和灵活,有助于开发者写出更清晰、更易于维护的代码,并提高了工具(如IDE和静态分析工具)分析和理解代码的能力。通过这些新的类型提示特性,Python 3.11 进一步加强了它作为一种强类型语言的地位。

4. 标准库的更新

在 Python 3.11 中,标准库的更新包括对 TOML 文件的支持以及正则表达式模块的增强。这些更新为 Python 用户带来了更多便利和效率。以下是这些更新的详细说明:

TOML 只读支持
  • 新增模块 tomllib: Python 3.11 引入了一个新的模块 tomllib,专门用于读取 TOML(Tom’s Obvious, Minimal Language)格式的文件。
  • 应用: TOML 格式广泛用于配置文件,如 Python 项目的 pyproject.toml。这种格式由于其简洁性和易读性而受到欢迎。
  • 功能限制: tomllib 模块专注于读取 TOML 文件,但它不支持创建或写入 TOML 文件。如果需要写入功能,开发者需要依赖第三方库如 tomlkittomli-w
  • 优势: 通过将 TOML 读取功能集成到标准库中,Python 使得处理这种流行的配置格式更加方便,无需额外安装第三方库来仅读取 TOML 文件。
正则表达式的增强
  • 原子组的支持: Python 3.11 对 re(正则表达式)模块进行了增强,特别是通过支持原子组(atomic groups)。原子组是正则表达式中的一种构造,它们确保一旦一部分模式匹配,就不会因为后面的模式失败而回溯。
  • 语法: 在 Python 3.11 中,原子组可以使用通用的原子分组语法(例如,(? > ...))。
  • 用途: 原子组在需要精确控制正则表达式匹配行为时非常有用,尤其是在处理复杂的模式时。
  • 性能提升: re 模块的模式匹配引擎经过重写,使其性能提升了约 10%。这种提升对于频繁使用正则表达式的应用程序来说是一个重要的改进,尤其是在数据处理和文本分析等领域。
总结

这些更新反映了 Python 标准库的持续发展和对现代编程需求的响应。通过集成对 TOML 文件的读取支持,Python 简化了项目配置文件的处理。同时,正则表达式模块的增强和性能改进使得复杂的文本处理更加高效和可靠。这些改进增强了 Python 作为一个强大和灵活的编程语言的地位,使其更适合处理各种现代编程挑战。

5. 其他改进

内存优化
  • 延迟创建的命名空间: Python 3.11 对 Python 对象进行了内存优化,特别是通过延迟创建对象的命名空间。这意味着对象的命名空间(即存储其属性的结构)只有在真正需要时才会被创建。
  • 共享键: 另一个重要的优化是命名空间字典的键现在可以在不同的实例之间共享。这减少了重复创建相同的键所需的内存。
  • 效果: 这些改进使得 Python 对象占用更少的内存,特别是在创建大量相似对象时(例如,在数据处理或对象映射中)。
Unicode 字典
  • 所有键都是 Unicode: 在 Python 3.11 中,字典(dict 类型)的键现在统一为 Unicode,这意味着对于所有字符串键,它们都以统一的方式存储。
  • 不再存储散列值: 由于这种统一,字典不再需要为每个键存储单独的散列值,这进一步减少了字典的内存占用。
  • 提高缓存效率: 这种改变不仅减少了内存占用,还提高了字典操作的缓存效率,尤其是在处理大量的键值对时。
CPython 的 WebAssembly 支持
  • 编译到 WebAssembly 的实验性支持: Python 3.11 为 CPython(Python 的主要解释器)提供了编译到 WebAssembly(WASM)的实验性支持。
  • 项目发展: 这项支持有助于发展像 PyScript 这样的项目,这些项目利用 WebAssembly 让 Python 可以在浏览器中运行。
  • 潜在用途: 将 Python 运行在浏览器中开辟了新的应用领域,例如在前端开发中直接使用 Python,或者在没有传统 Python 运行时环境的地方运行 Python 代码。
  • 意义: 这表示 Python 正在拓展其应用范围,跨越传统的桌面和服务器环境,进入更多样化和互动性强的领域。
总结

Python 3.11 中的这些其他改进不仅提高了语言的性能,降低了资源消耗,而且扩展了其应用可能性。内存优化和 Unicode 字典的更新提升了 Python 在数据处理和大规模应用中的效率。而对 WebAssembly 的支持则开辟了新的应用领域,使得 Python 可以更灵活地适应不同的运行环境。这些更新进一步证明了 Python 作为一个现代、高效和适应性强的编程语言的地位。

在 Python 3.11 中,遵循 PEP 594 的指引,一些被认为是“dead batteries”(即过时或未维护的模块)被标记为弃用,并计划在未来的版本中移除。这是 Python 发展中的一个重要步骤,旨在保持语言的现代性和高效性。以下是这一过程的详细说明:

6.移除“dead batteries”

  • PEP 594: 从标准库中删除了许多过时或未维护的模块。这些模块在 Python 3.11 中被标记为弃用,并计划在 Python 3.13 中完全移除。

总结来说,Python 3.11 带来了异常处理的重大改进、类型提示的增强、标准库的更新和优化,以及性能和内存效率的提升,这些更新使得 Python 更加高效和易于使用。

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

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

相关文章

系列二、Lock接口

一、多线程编程模板 线程 操作 资源类 高内聚 低耦合 二、实现步骤 1、创建资源类 2、资源类里创建同步方法、同步代码块 三、12306卖票程序 3.1、synchronized实现 3.1.1、Ticket /*** Author : 一叶浮萍归大海* Date: 2023/11/20 8:54* …

试用无线调试器PowerDebugger小记

试用无线调试器PowerDebugger小记 文章目录 试用无线调试器PowerDebugger小记引言准备软硬件环境PowerDebugger 无线调试器EVB-YTM32B1LE0-Q64 开发板 开始调试小结参考文献 引言 多年前调试智能车时&#xff0c;抱着电脑连着小车在跑道上一边跑一边看数据的经历&#xff0c;让…

计算机毕业设计选题推荐-家庭理财微信小程序/安卓APP-项目实战

✨作者主页&#xff1a;IT研究室✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…

Vue使用基本教程(基本介绍及对比,初步使用,构建项目,编辑器等)

一、Vue及与其他前端框架的异同。 Vue.js&#xff08;通常简称为Vue&#xff09;是一个用于构建用户界面的渐进式JavaScript框架。它专注于视图层&#xff0c;采用简单的API设计&#xff0c;使得开发者能够更轻松地构建交互式的单页面应用&#xff08;SPA&#xff09;和用户界…

leetcode:504. 七进制数

一、题目&#xff1a; 链接&#xff1a; 504. 七进制数 - 力扣&#xff08;LeetCode&#xff09; 函数原型&#xff1a; char* convertToBase7(int num) 二、思路 本题要将十进制数转换为二进制数&#xff0c;只要将十进制num数模7再除7&#xff0c;直到num等于0 每次将模7的结…

编写高效的消息传递代码-对消息进行降维

DGL优化了消息传递的内存消耗和计算速度。利用这些优化的一个常见实践是通过基于内置函数的 update_all() 来开发消息传递功能。 除此之外&#xff0c;考虑到某些图边的数量远远大于节点的数量&#xff0c;DGL建议避免不必要的从点到边的内存拷贝。对于某些情况&#xff0c;比…

hologres 索引与查询优化

hologres 优化部分 1 hologres 建表优化1.1 建表中的配置优化1.1 字典索引 dictionary_encoding_columns1.2 位图索引 bitmap_columns1.2.2 Bitmap和Clustering Key的区别 1.3 聚簇索引Clustering Key 1 hologres 建表优化 1.1 建表中的配置优化 根据 holo的 存储引擎部分的知…

【AI视野·今日Robot 机器人论文速览 第六十四期】Fri, 27 Oct 2023

AI视野今日CS.Robotics 机器人学论文速览 Fri, 27 Oct 2023 Totally 27 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Robotics Papers 6-DoF Stability Field via Diffusion Models Authors Takuma Yoneda, Tianchong Jiang, Gregory Shakhnarovich, Matthew R. …

JVM:内存模型、内存分配机制、内存分配冲突、JVM垃圾标记算法、JVM1.8增加元数据区缘由

文章目录 JVM 内存模型线程共享区&#xff1a;堆方法区(元空间) 线程私有区线程栈 本地方法栈程序计数器 为什么JDK1.8会增加对方法区的实现/为什么JDK1.8将方法区更改为元数据区JVM内存分配机制指针碰撞空闲列表 内存分配冲突CAS乐观锁解决TLAB解决 JVM垃圾标记算法1、引用计数…

PostgreSQL数据库结合内网穿透实现公网远程连接

文章目录 前言1. 安装postgreSQL2. 本地连接postgreSQL3. Windows 安装 cpolar4. 配置postgreSQL公网地址5. 公网postgreSQL访问6. 固定连接公网地址7. postgreSQL固定地址连接测试 前言 PostgreSQL是一个功能非常强大的关系型数据库管理系统&#xff08;RDBMS&#xff09;,下…

智能门禁刷脸照片格式gif、bmp,png转换,转换base64

随着刷脸闸机的普及&#xff0c;很多场所都使用了刷脸金闸机&#xff0c;很多时候对方传来的照片格式不对。 刷脸闸机对应的格式都是jpg 照片来源&#xff1a;访客手机上传&#xff0c;管理员上传&#xff0c;团队购票上传 在转换的语言很多&#xff0c;在网站中php使用较为…

Python的os.path.join()详解

当你需要构建文件路径时&#xff0c;os.path.join() 是一个很有用的方法。这个方法会根据你的操作系统使用正确的路径分隔符&#xff08;例如&#xff0c;在 Windows 上是反斜杠 \&#xff0c;在类 Unix 系统上是正斜杠 /&#xff09;来连接路径中的各个部分。这样你就可以确保…

44-设计问题-最小栈

原题链接&#xff1a; 198. 打家劫舍 题目描述&#xff1a; 你是一个专业的小偷&#xff0c;计划偷窃沿街的房屋。每间房内都藏有一定的现金&#xff0c;影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统&#xff0c;如果两间相邻的房屋在同一晚上被小偷闯入&a…

【洛谷 P3743】kotori的设备 题解(二分答案+循环)

kotori的设备 题目背景 kotori 有 n n n 个可同时使用的设备。 题目描述 第 i i i 个设备每秒消耗 a i a_i ai​ 个单位能量。能量的使用是连续的&#xff0c;也就是说能量不是某时刻突然消耗的&#xff0c;而是匀速消耗。也就是说&#xff0c;对于任意实数&#xff0c;…

数据结构--串的基本概念

目录 串的基本概念 串的定义 串与线性表对比 ​串的基本操作​ 串的比较 字符集编码 乱码问题​编辑 总结 ​串的存储结构 ​串的顺序存储​编辑 串的链式存储 串的基本操作 1、求字串 2、比较 3、定位操作 总结 串的基本概念 串的定义 串与线性表对比 串的…

python的socket模块以及通信相关学习笔记

Socket又称"套接字"&#xff0c;应用程序通常通过"套接字"向网络发出请求或者应答网络请求&#xff0c;使主机间或者一台计算机上的进程间可以通讯(最初设计是为了是使同一台计算机中的不同进程进行信息传递通信)&#xff0c;最后拓展到可以使网络上两台计…

俄罗斯方块游戏制作

创建包和文件夹 1.创建小方块类 package eluosifangkuai; import java.awt.image.BufferedImage; import java.util.Objects;/*** author xiaoZhao* date 2022/5/7* describe* 小方块类* 方法&#xff1a; 左移、右移、下落*/ public class Cell {// 行private int row;//…

CentOS部署Skywalking

一、安装Docker #yum -y install gcc #yum -y install gcc-c #yum install -y yum-utils 设置国内的镜像仓库 #yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 更新yum软件包索引 #yum makecache fast 安装Docker引擎 #yum …

Java对List的操作

List<Person>转成map&#xff0c;并自定义key 假设有一List中有如下数据 Person{id100, name张三0100} Person{id101, name张三1100} Person{id102, name张三2100} Person{id103, name张三3100} Person{id104, name张三4100} Person{id105, name张三5100} Person{id106…

猫12分类:使用多线程爬取图片的Python程序

本文目标 对于猫12目标检测部分的数据集&#xff0c;采用网络爬虫来制作数据集。 在网络爬虫中&#xff0c;经常需要下载大量的图片。为了提高下载效率&#xff0c;可以使用多线程来并发地下载图片。本文将介绍如何使用Python编写一个多线程爬虫程序&#xff0c;用于爬取图片…