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

2023-11-21 07:28

本文主要是介绍快速弄懂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 更加高效和易于使用。

这篇关于快速弄懂Python3.11中的新特性的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/400773

相关文章

电脑桌面文件删除了怎么找回来?别急,快速恢复攻略在此

在日常使用电脑的过程中,我们经常会遇到这样的情况:一不小心,桌面上的某个重要文件被删除了。这时,大多数人可能会感到惊慌失措,不知所措。 其实,不必过于担心,因为有很多方法可以帮助我们找回被删除的桌面文件。下面,就让我们一起来了解一下这些恢复桌面文件的方法吧。 一、使用撤销操作 如果我们刚刚删除了桌面上的文件,并且还没有进行其他操作,那么可以尝试使用撤销操作来恢复文件。在键盘上同时按下“C

hdu 4565 推倒公式+矩阵快速幂

题意 求下式的值: Sn=⌈ (a+b√)n⌉%m S_n = \lceil\ (a + \sqrt{b}) ^ n \rceil\% m 其中: 0<a,m<215 0< a, m < 2^{15} 0<b,n<231 0 < b, n < 2^{31} (a−1)2<b<a2 (a-1)^2< b < a^2 解析 令: An=(a+b√)n A_n = (a +

v0.dev快速开发

探索v0.dev:次世代开发者之利器 今之技艺日新月异,开发者之工具亦随之进步不辍。v0.dev者,新兴之开发者利器也,迅速引起众多开发者之瞩目。本文将引汝探究v0.dev之基本功能与优势,助汝速速上手,提升开发之效率。 何谓v0.dev? v0.dev者,现代化之开发者工具也,旨在简化并加速软件开发之过程。其集多种功能于一体,助开发者高效编写、测试及部署代码。无论汝为前端开发者、后端开发者

ActiveMQ—消息特性(延迟和定时消息投递)

ActiveMQ消息特性:延迟和定时消息投递(Delay and Schedule Message Delivery) 转自:http://blog.csdn.net/kimmking/article/details/8443872 有时候我们不希望消息马上被broker投递出去,而是想要消息60秒以后发给消费者,或者我们想让消息没隔一定时间投递一次,一共投递指定的次数。。。 类似

PostgreSQL核心功能特性与使用领域及场景分析

PostgreSQL有什么优点? 开源和免费 PostgreSQL是一个开源的数据库管理系统,可以免费使用和修改。这降低了企业的成本,并为开发者提供了一个活跃的社区和丰富的资源。 高度兼容 PostgreSQL支持多种操作系统(如Linux、Windows、macOS等)和编程语言(如C、C++、Java、Python、Ruby等),并提供了多种接口(如JDBC、ODBC、ADO.NET等

利用Django框架快速构建Web应用:从零到上线

随着互联网的发展,Web应用的需求日益增长,而Django作为一个高级的Python Web框架,以其强大的功能和灵活的架构,成为了众多开发者的选择。本文将指导你如何从零开始使用Django框架构建一个简单的Web应用,并将其部署到线上,让世界看到你的作品。 Django简介 Django是由Adrian Holovaty和Simon Willison于2005年开发的一个开源框架,旨在简

详解Tomcat 7的七大新特性和新增功能(1)

http://developer.51cto.com/art/201009/228537.htm http://tomcat.apache.org/tomcat-7.0-doc/index.html  Apache发布首个Tomcat 7版本已经发布了有一段时间了,Tomcat 7引入了许多新功能,并对现有功能进行了增强。很多文章列出了Tomcat 7的新功能,但大多数并没有详细解释它们

如何掌握面向对象编程的四大特性、Lambda 表达式及 I/O 流:全面指南

这里写目录标题 OOP语言的四大特性lambda输入/输出流(I/O流) OOP语言的四大特性 面向对象编程(OOP)是一种编程范式,它通过使用“对象”来组织代码。OOP 的四大特性是封装、继承、多态和抽象。这些特性帮助程序员更好地管理复杂的代码,使程序更易于理解和维护。 类-》实体的抽象类型 实体(属性,行为) -》 ADT(abstract data type) 属性-》成

CentOs7上Mysql快速迁移脚本

因公司业务需要,对原来在/usr/local/mysql/data目录下的数据迁移到/data/local/mysql/mysqlData。 原因是系统盘太小,只有20G,几下就快满了。 参考过几篇文章,基于大神们的思路,我封装成了.sh脚本。 步骤如下: 1) 先修改好/etc/my.cnf,        ##[mysqld]       ##datadir=/data/loc

SAM2POINT:以zero-shot且快速的方式将任何 3D 视频分割为视频

摘要 我们介绍 SAM2POINT,这是一种采用 Segment Anything Model 2 (SAM 2) 进行零样本和快速 3D 分割的初步探索。 SAM2POINT 将任何 3D 数据解释为一系列多向视频,并利用 SAM 2 进行 3D 空间分割,无需进一步训练或 2D-3D 投影。 我们的框架支持各种提示类型,包括 3D 点、框和掩模,并且可以泛化到不同的场景,例如 3D 对象、室