发布周期一年了,前几天还以为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()
看到else
Ya的返回值finally
我想我注意到没有与该行对应的项目。没有声明这些行实际上要执行,在其他del
, 中global
,nonlocal
您点击它。
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
则会抛出异常。
其他语言更改
-
int
bit_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_dir
的dir_fd
参数已经添加,您现在可以指定文件搜索的根目录。前者是类路径对象,后者指定根目录的文件描述符。
ssl
现在需要 OpenSSL 1.1.1 或更高版本 ( PEP-644 )
类型
types.EllipsisType
, types.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的开发将开始,我想逐步跟进。