Python 3.10 中的新增功能(摘要)

发布周期一年了,前几天还以为3.9刚出来的时候,3.10的a2已经出来了(汗)。写到这里,下一个α版本会和正式版同时发布,所以是按计划进行的,只是节奏有点快(^^;(←这是我刚开始的时候的评论)写这篇文章。)

不过,我很好奇下一个版本会出现什么,所以我想提取和总结一下。3.9 的下一个版本是 3.10 而不是 4.0(笑)。首先是通常的开发路线图(PEP-619)。

  • 3.10.0 开发开始:2020-05-18(完成)
  • 3.10.0 alpha 1:2020-10-05(完成)
  • 3.10.0 alpha 2:2020-11-02-> 2020-11-04(已完成)
  • 3.10.0 alpha 3:2020-12-07(完成)
  • 3.10.0 alpha 4:2021-01-04(已完成)
  • 3.10.0 alpha 5:2021-02-03(已完成)
  • 3.10.0 alpha 6:2021-03-01(完成)
  • 3.10.0 alpha 7:2021-04-06(完成)
  • 3.10.0 beta 1:2021-05-03(完成)
  • 3.10.0 beta 2:2021-05-31(完成)
  • 3.10.0 beta 3:2021-06-17(完成)
  • 3.10.0 beta 4:2021-07-10(完成)
  • 3.10.0 候选1:2021-08-03(已完成)
  • 3.10.0候选2:2021-09-07(已完成)
  • 3.10.0 决赛:2021-10-04(完成!)

按照计划,3.10 于 2021 年 10 月发布,仅比 3.9 晚了一年。

更改日志

2021-10-04

  • 基于 2021-10-04 发布的 3.10.0 修订。
    • 添加了“PEP-626:显示用于调试等的准确行号”。
    • 描述已更改,因为“PEP-563:注释的惰性评估成为默认值”的引入已被推迟。

2021-05-04

  • 基于 2021-05-03 发布的 3.10 beta 1 进行了修订。
    • 添加了关于结构模式匹配的内容
    • 添加了需要 OpenSSL 1.1.1 或更高版本的情况

2021-01-24

  • 基于 2021-01-04 发布的 3.10 alpha 4 进行了修订。
    • 在弃用时间表中添加了 PEP-623(与 Unicode 内部实现相关)
    • 我写了一篇关于“PEP-612:参数规范变量”的单独文章,并添加了一个链接。

2020-11-07

  • 第一个版本。a2 于 2020 年 10 月 4 日发布,但我是根据新内容编写的。

精选新功能

PEP 634:结构模式匹配

我认为这是 Python 3.10 的主要功能,但模式匹配功能即将加入 Python。这是 Rust 和 Scala 中熟悉的特性,我认为它将来会在 Python 中大量使用,因为 Python 没有 switch 语句。

→ 另一篇文章:Python 3.10 新特性(二)——Python 中的 match 语句

PSP 626:显示准确的行号以进行调试等。

发生运行时错误时会显示堆栈跟踪,其中的行号是非常重要的调试信息。在大多数情况下,以前的实现显示正确的行号,但在某些情况下不是。正是这个 PEP 修复了它。

之前,运行字节码对应的源代码行号f_lineno保存在框架对象的属性中。除此之外co_lines(),还增加了一个调用方法,使字节码和行号的关系更加清晰。

例如,以下面的代码为例。为方便起见,还显示了行号。

 1 from dis import dis 2 3 def f(a): 4 try: 5 if a: 6 print("yes") 7 else: 8 print("done") 9 finally: 10 print("done") 11 12 if __name__ == "__main__": 13 code = f.__code__ 14 print("==co_lines==") 15 print(list(code.co_lines())) 16 print("\n==bytecode==") 17 dis(code.co_code) 

这样做将为您提供以下输出:

==co_lines== [(0, 2, 4), (2, 6, 5), (6, 16, 6), (16, 26, 8), (26, 38, 10), (38, 40, 6), (40, 62, 10)] ==bytecode== 0 SETUP_FINALLY 25 (to 52) 2 LOAD_FAST 0 (0) 4 POP_JUMP_IF_FALSE 8 (to 16) 6 LOAD_GLOBAL 0 (0) 8 LOAD_CONST 1 (1) 10 CALL_FUNCTION 1 12 POP_TOP 14 JUMP_FORWARD 11 (to 38) >> 16 LOAD_GLOBAL 0 (0) 18 LOAD_CONST 2 (2) 20 CALL_FUNCTION 1 22 POP_TOP 24 POP_BLOCK 26 LOAD_GLOBAL 0 (0) 28 LOAD_CONST 2 (2) 30 CALL_FUNCTION 1 32 POP_TOP 34 LOAD_CONST 0 (0) 36 RETURN_VALUE >> 38 POP_BLOCK 40 LOAD_GLOBAL 0 (0) 42 LOAD_CONST 2 (2) 44 CALL_FUNCTION 1 46 POP_TOP 48 LOAD_CONST 0 (0) 50 RETURN_VALUE >> 52 LOAD_GLOBAL 0 (0) 54 LOAD_CONST 2 (2) 56 CALL_FUNCTION 1 58 POP_TOP 60 RERAISE 0 

co_lines()是一个返回三个值的元组的生成器,每个值(バイトコードの開始オフセット、バイトコードの終了オフセット, 行番号)都是。因此,第一个(0, 2, 4)是“0从字节码的第二个到2第二个(之前)的行号4”。所以如果你看源码,你可以看到它是一个try句子。简而言之,

 0 SETUP_FINALLY 25 (to 52) 

会有try执行的。同样,第二个(2, 6, 5)是“2从字节码的第二个到6第二个(之前)的行号5”。

 2 LOAD_FAST 0 (0) 4 POP_JUMP_IF_FALSE 8 (to 16) 

if语句的执行。

应该注意的是,co_lines()看到elseYa的返回值finally我想我注意到没有与该行对应的项目。没有声明这些行实际上要执行,在其他del, 中globalnonlocal您点击它。

PEP 563:注释默认值的延迟评估

我介绍了 Python-3.7 的一个新特性,延迟注释评估”。该行为现在是默认设置 默认已被推迟。

以前启用延迟评估

from __future__ import annotations 

我不得不放一个 import 声明,说,但从 3.10 开始,它应该没有必要了。其实在α版就已经引入了,但是之后发现影响范围大,比如很多过去的资产都停止工作了,就推迟了引入。有关更多详细信息,请参阅此博客文章@methane,谢谢您的指出。

PEP 613:类型别名注释

类型别名(为类型添加别名)是在PEP 484中引入的,但是存在一个问题,就是它们很难与对普通变量的赋值区分开来,因为它们是由顶层的赋值表达式表达的。TypeAlias添加了注释以阐明它是一个类型别名。

例如,直到现在

IntType = int 

写了什么

IntType: TypeAlias = int 

你将能够像这样写。

PEP 604:共享运算符

这也是一个类型关系的变化,但是直到现在,当注释采用两种或多种类型的变量时,

number: Union[int, float] 

我必须写的地方

number: int | float 

你将能够写作。感觉就像合并了 TypeScript 中使用的符号。

PEP-612:参数规范变量

→ 单独的文章:Python 3.10 (1) 中的新功能-参数规范变量

PEP 618:zip 函数的附加参数

zip()strict函数中添加了一个参数,True用于检查此时 zip 的两个可迭代对象的长度是否相同。如果长度不同,ValueError则会抛出异常。

其他语言更改

  • intbit_count()已将方法添加到类型变量。这是以二进制表示形式1返回整数的数量。貌似这也叫Population Count(或pop count),不过基本bin(a).count('1')和我们做的一样,好像处理速度变快了。

  • 字典类型方法keys()values()items()返回视图对象mapping属性被添加,您现在可以访问原始字典数据。

  • Decimal 和 Fraction 不能再用作整数参数值。比如下面的代码DeprecationWarning是在Python-3.9.中发出的,但是从python-3.10就变成了错误。

 from decimal import Decimal i = Decimal(97) print(chr(i)) 

新增模块

3.10 中似乎没有其他模块。

模块改进

base64

添加了 RFC-4648以支持在base64.b43hexencode()门中定义的扩展十六进制字母表base64.b43hexdecode()。常规的 Base32 字母表不使用 '0' 和 '1',它们看起来与其他字符相似,但是这个扩展的 Hex 字母表确实使用了它们并映射了它们。特点是字符按排序顺序排序(虽然是什么让我快乐是个谜)。

诅咒

您将能够使用 ncurses 6.1 中引入的扩展颜色。curses.has_extended_color_support()您可以检查您在 Python 中使用的 ncurses 库是否支持此.

球体

glob()iglob()root_dirdir_fd参数已经添加,您现在可以指定文件搜索的根目录。前者是类路径对象,后者指定根目录的文件描述符。

ssl

现在需要 OpenSSL 1.1.1 或更高版本 ( PEP-644 )

类型

types.EllipsisTypetypes.NoneType,types.NotImplementedType但是(重新)它被引入了。

优化

  • str() bytes() bytesarray()更快(小物体的 30-40%)
  • runpy模块导入更少的模块,python -m モジュール名运行时平均启动时间快 1.3 倍

计划废除

  • 从这个版本开始,为了与 python2.7 兼容而留下的旧导入方法将被弃用。
  • find_loader()find_module()load_module()__package__Attribute,__loader__属性将在以后的版本中清除。
  • Unicode 的内部实现已被篡改,PEP-393 中引入的 C 语言 API 以及这些 API 中使用的 unicode 对象中的数据将被弃用。最初计划在 Python 4.0 中删除,但由于 4.0 没有计划,它将在 3.12 中删除。这为每个字符串节省了 8 个字节,还减少了调用 API ( PEP-623 )时的开销。

删除功能

  • complex类的__int____float____floordiv____mod____divmod____rfloordiv____rmod____rdivmod__方法已被删除。

概括

这是 Python 3.10 中更改的摘要。既然变成了b1,我觉得现在的规范是Fix。我可能会补充一些我还没有引入的变化,但是3.11的开发将开始,我想逐步跟进。

​​​​​​​

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值