快速弄懂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
这个错误消息告诉我们两件事:
- 错误发生在文件的第 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 文件。如果需要写入功能,开发者需要依赖第三方库如tomlkit
或tomli-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 更加高效和易于使用。
相关文章:
快速弄懂Python3.11中的新特性
Python 3.11 引入了许多新特性和改进,让我们逐一详细了解这些更新: 1. 更详细的错误消息 Python 3.11 在错误报告方面做出了显著改进,与 Python 3.10 相比,它提供了更详细的错误消息,能够指出表达式中具体哪个部分导…...

七,vi和vim
Linux系统会内置vi文本编辑器 Vim具有程序编辑的能力,可以看做是Vi的增强版本,可以主动的以字体颜色辨别语法的正确性,方便程序设计。代码补完、编译及错误跳转等方便编程的功能特别丰富,在程序员中被广泛使用。 vi和vim常用的三…...

湖科大计网:传输层
一、传输层概述 一、基本概念 传输层是端到端的协议。 因特网的两种不同的传输层协议: TCP:面向连接 UDP:无连接 我们在学习的过程中,只需要关注传输层之间的通信,不需要关注传输层协议数据是经过路由器转发至目的网络…...

设计模式(二)-创建者模式(3)-抽象工厂模式
一、为什么需要抽象工厂模式? 在工厂模式中,我们需要定义多个继承于共同工厂抽象基类的工厂子类,这些子类负责创建一个对应的对象。工厂模式存在一个缺点就是:每次扩展新的工厂子类,就会增加系统的复杂度。 如果我们…...

[计算机网络]网络层概述
呼,写了这么久终于重新开始啦! 自己落下了太多东西了.....是时候应该重新拾掇起来了. 关于后面的代码项目,我的想法是vilas.js仍然使用js来进行编写,但是后续其他的项目会开始尝试使用ts来进行书写了. 就算是前端也需要点规范吧..... 0.写在前面 这篇文章要和大家道个歉,首…...

猫12分类:使用yolov5训练检测模型
前言: 在使用yolov5之前,尝试过到百度飞桨平台(小白不建议)、AutoDL平台(这个比较友好,经济实惠)训练模型。但还是没有本地训练模型来的舒服。因此远程了一台学校电脑来搭建自己的检测模型。配置…...

Kubernetes Dashboard部署ImagePullBackOff问题处理
通常,出现ImagePullBackOff问题是由于Kubernetes集群无法拉取所需的镜像导致的。解决这个问题的方法通常包括以下步骤: 1. 检查Pod的描述信息: kubectl describe pod/[pod名称] --namespacekubernetes-dashboard 查看Events部分是否有关于…...

十四、Docker的基本操作
目录 (一)镜像命令 一、拉取Nginx 二、查看镜像 三、导出文件 四、删除镜像 五、加载镜像 (二)容器命令 一、例子:运行一个nginx容器 1、输入运行命令 2、使用命令查看宿主机ip 3、在外部浏览器访问 4、查看…...

C#,数值计算——插值和外推,分段线性插值(Linear_interp)的计算方法与源程序
1 文本格式 using System; namespace Legalsoft.Truffer { /// <summary> /// 分段线性插值 /// Piecewise linear interpolation object. /// Construct with x and y vectors, then call interp for interpolated values. /// </summary> …...
详细讲解什么是单例模式
当谈到单例模式时,我们指的是一种设计模式,它确保一个类只有一个实例,并提供一个全局访问点来访问该实例。这种模式在软件开发中很常见,特别是需要控制资源访问、配置管理、日志记录器等情况下。 让我们用一个简单的例子来解释单…...
在springBoot中同时使用mysql和MongoDB
在SpringBoot中非关系向数据库MongoDB和关系型数据库MySQL都可通过引入相关依赖并按照指定配置单独集成; mysql引入依赖: compile "org.springframework.boot:spring-boot-starter-web:1.5.18.RELEASE"compile "org.springframework.boot:spring-boot-start…...

2023.11.19 hadoop之MapReduce
目录 1.简介 2.分布式计算框架-Map Reduce 3.mapreduce的步骤 4.MapReduce底层原理 map阶段 shuffle阶段 reduce阶段 1.简介 Mapreduce是一个分布式运算程序的编程框架,是用户开发“基于hadoop的数据分析应用”的核心框架; Mapreduce核心功能是…...
力扣第841题 钥匙和房间 C++ DFS BFS 附Java代码
题目 841. 钥匙和房间 中等 相关标签 深度优先搜索 广度优先搜索 图 有 n 个房间,房间按从 0 到 n - 1 编号。最初,除 0 号房间外的其余所有房间都被锁住。你的目标是进入所有的房间。然而,你不能在没有获得钥匙的时候进入锁住的房间…...

React 中 react-i18next 切换语言( 项目国际化 )
背景 平时中会遇到需求,就是切换语言,语种等。其实总的来说都是用i18n来实现的 思路 首先在项目中安装i18n插件,然后将插件引入到项目,然后配置语言包(语言包需要你自己来进行配置,自己编写语言包ÿ…...
antd design 5 版本 文件上传
<UploadcustomRequest{customRequest}accept".csv" showUploadList{false}><Button icon{<UploadOutlined />}>上传 CSV 文件</Button></Upload> accept 代表限制的上传类型 也可设置 .excel // 文件上传 ( CSV ) const customReques…...
【如何学习Python自动化测试】—— 浏览器操作
4 、 浏览器操作 4.1 浏览器最大化 Webdriver 打开浏览器后,默认不是最大化,如果需要界面最大化,需要通过 maximize_window()方法来实现,代码如下: maximize_window()方法是Selenium WebDriver提供的一个方法…...

Python编程技巧 – 使用字典
Python编程技巧 – 使用字典 Python Programming Skills – Using Dictionary Dictionary, 即字典,这是Python语言的一种重要的数据结构;Python字典是以键(key)值(value)对为元素,来存储数据的集合。 前文提到Python列…...

el-tree 与table表格联动
html部分 <div class"org-left"><el-input v-model"filterText" placeholder"" size"default" /><el-tree ref"treeRef" class"filter-tree" :data"treeData" :props"defaultProp…...

Leetcode刷题详解——删除并获得点数
1. 题目链接:740. 删除并获得点数 2. 题目描述: 给你一个整数数组 nums ,你可以对它进行一些操作。 每次操作中,选择任意一个 nums[i] ,删除它并获得 nums[i] 的点数。之后,你必须删除 所有 等于 nums[i] …...

HTTP四种请求方式,状态码,请求和响应报文
1.get请求 一般用于获取数据请求参数在URL后面请求参数的大小有限制 2.post请求 一般用于修改数据提交的数据在请求体中提交数据的大小没有限制 3.put请求 一般用于添加数据 4.delete请求 一般用于删除数据 5.一次完整的http请求过程 域名解析:使用DNS协议…...
变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析
一、变量声明设计:let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性,这种设计体现了语言的核心哲学。以下是深度解析: 1.1 设计理念剖析 安全优先原则:默认不可变强制开发者明确声明意图 let x 5; …...
利用ngx_stream_return_module构建简易 TCP/UDP 响应网关
一、模块概述 ngx_stream_return_module 提供了一个极简的指令: return <value>;在收到客户端连接后,立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量(如 $time_iso8601、$remote_addr 等)&a…...
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...

循环冗余码校验CRC码 算法步骤+详细实例计算
通信过程:(白话解释) 我们将原始待发送的消息称为 M M M,依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)(意思就是 G ( x ) G(x) G(x) 是已知的)࿰…...

为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?
在建筑行业,项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升,传统的管理模式已经难以满足现代工程的需求。过去,许多企业依赖手工记录、口头沟通和分散的信息管理,导致效率低下、成本失控、风险频发。例如&#…...

基于当前项目通过npm包形式暴露公共组件
1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹,并新增内容 3.创建package文件夹...
比较数据迁移后MySQL数据库和OceanBase数据仓库中的表
设计一个MySQL数据库和OceanBase数据仓库的表数据比较的详细程序流程,两张表是相同的结构,都有整型主键id字段,需要每次从数据库分批取得2000条数据,用于比较,比较操作的同时可以再取2000条数据,等上一次比较完成之后,开始比较,直到比较完所有的数据。比较操作需要比较…...

【C++】纯虚函数类外可以写实现吗?
1. 答案 先说答案,可以。 2.代码测试 .h头文件 #include <iostream> #include <string>// 抽象基类 class AbstractBase { public:AbstractBase() default;virtual ~AbstractBase() default; // 默认析构函数public:virtual int PureVirtualFunct…...

【无标题】湖北理元理律师事务所:债务优化中的生活保障与法律平衡之道
文/法律实务观察组 在债务重组领域,专业机构的核心价值不仅在于减轻债务数字,更在于帮助债务人在履行义务的同时维持基本生活尊严。湖北理元理律师事务所的服务实践表明,合法债务优化需同步实现三重平衡: 法律刚性(债…...

Android写一个捕获全局异常的工具类
项目开发和实际运行过程中难免会遇到异常发生,系统提供了一个可以捕获全局异常的工具Uncaughtexceptionhandler,它是Thread的子类(就是package java.lang;里线程的Thread)。本文将利用它将设备信息、报错信息以及错误的发生时间都…...