目录
Python 3.12在10月2日发布,新版本包含一系列对语言和标准库的改变。 库的改变主要集中在清理已弃用的 API、可用性和正确性等方面。 值得注意的是,distutils 包已从标准库中移除。 os 和 pathlib 中的文件系统支持增加了许多改进,而且部分模块的性能也获得了提升。语言的改变主要集中在可用性方面,如 f-字符串 的许多限制已被移除,并且改进错误信息的提示,使开发者能更好地理解错误发生的原因;新的类型形参语法 和 type 语句提升了 泛型类型 和 类型别名 配合静态类型检查器使用时的效率。另外还有其他一系列的性能改进,开发团队称其性能整体提升了5%。以下对其中的f-string解析的新特性作些简单分享:
老版本中f-string原本不能包含任何反斜杠符号“\”和Unicode转义,新版本允许使用。但特殊的大括号的转义用双写: {{ 和 }}。例如:
print(f"Hello\n{{H\na\nn\nn}}")
Hello
{H
a
n
n}
过去的版本中,如果定义的f-string是单行字符串,那么大括号里面的表达式也必须写在一行内。现在这个限制也没了,只要符合语法就可以。例如:
x,y=1,2
print(f"""{x}.This is a
multiline f-string.
{y}.It can contain any text.
另外:表达式可以换行书写:{x+
y**3}
""")
输出:
1.This is a ?
multiline f-string.
2.It can contain any text.?
另外:表达式可以换行书写:9
新版本中可以在表达式里重复使用f-string使用过的引号种类,不用像老版本中只能在双引里放单引号,单引号里放双引呈。例如:
print(f"重复相同的引号: {"+".join(["1","2","3"])}")
输出:
重复相同的引号: 1+2+3?
在新版本中,用户可以无限地嵌套f-string,这在过去受限于引号冲突是无法做到的,这是特性3引申出来的功能。例如:
name = "Hann"
print(f"Hello, {f"Hello, {name}!"}!")
print(f"{f"{f"{f"{f"{f"{name+str(2023.12)}"}"}"}"}"}")
输出:
Hello, Hello, Hann!
Hann2023.12
再举一个稍微复杂一点的例子:
name = "Hann"
age = 50
city = "KunShann"
address = f"123 Main St, {city}"
template = f"""
Hello, {name}! \nYou are {age} years old.
Your address is {address}.
"""
print(template)
输出:?
Hello, Hann!?
You are 50 years old. ?
Your address is 123 Main St, KunShann.?
PEP 695,类型形参语法和 type 语句
新的语法特性:
PEP 701,f-字符串 语法的改进
解释器的改进:
PEP 684,解释器级的单独 GIL
PEP 669,低开销的监控
针对 NameError, ImportError 和 SyntaxError 异常 改进了 'Did you mean ...' 提示消息。
对 Python 数据模型的改进:
PEP 688,使用 Python 的 缓冲区协议
标准库中的重大改进:
pathlib.Path 类现在支持子类化
os 模块获得了多项针对 Windows 支持的改进
在 sqlite3 模块中添加了 命令行界面。
基于 运行时可检测协议 的 isinstance() 检测获得了 2 至 20 倍的提速
asyncio 包的性能获得了多项改进,一些基准测试显示有 75% 的提速。
在 uuid 模块中添加了 命令行界面。
由于 PEP 701 中的更改,通过 tokenize 模块生成令牌(token)的速度最多可提高 64%。
安全改进:
用来自 HACL* 项目的经过正式验证的代码替代 SHA1, SHA3, SHA2-384, SHA2-512 和 MD5 的内置 hashlib 实现。 这些内置实现保留作为仅在当 OpenSSL 未提供它们时使用的回退选项。
C API 的改进:
PEP 697,不稳定 C API 层
PEP 683,永生对象
CPython 实现的改进:
PEP 709,推导式内联化
对 Linux perf 性能分析器的 CPython 支持
在受支持的平台上实现栈溢出保护
新的类型标注特性:
PEP 692,使用 TypedDict 来标注 **kwargs
PEP 698,typing.override() 装饰器
重要的弃用、移除或限制:
PEP 623: 在 Python 的 C API 中移除 Unicode 对象中的 wstr,使每个 str 对象的大小缩减至少 8 个字节。
PEP 632: 移除 distutils 包。 请参阅 迁移指南 了解有关替换其所提供的 API 的建议。 第三方 Setuptools 包将继续提供 distutils,如果你在 Python 3.12 及更高版本中仍然需要它的话。
gh-95299: 不在使用 venv 创建的虚拟环境中预装 setuptools。 这意味着 distutils、setuptools、pkg_resources 和 easy_install 默认将不再可用;要访问这些工具请在 激活的 虚拟环境中运行 pip install setuptools。
移除了 asynchat、asyncore 和 imp 模块,以及一些 unittest.TestCase 方法别名。