Python3.12 新版本之f-string的几个新特性

简介: Python3.12 新版本之f-string的几个新特性

概述

Python 3.12在10月2日发布,新版本包含一系列对语言和标准库的改变。 库的改变主要集中在清理已弃用的 API、可用性和正确性等方面。 值得注意的是,distutils 包已从标准库中移除。 os 和 pathlib 中的文件系统支持增加了许多改进,而且部分模块的性能也获得了提升。语言的改变主要集中在可用性方面,如 f-字符串 的许多限制已被移除,并且改进错误信息的提示,使开发者能更好地理解错误发生的原因;新的类型形参语法 和 type 语句提升了 泛型类型 和 类型别名 配合静态类型检查器使用时的效率。另外还有其他一系列的性能改进,开发团队称其性能整体提升了5%。以下对其中的f-string解析的新特性作些简单分享:

f-string表达式

1. 支持转义字符

老版本中f-string原本不能包含任何反斜杠符号“\”和Unicode转义,新版本允许使用。但特殊的大括号的转义用双写: {{ 和 }}。例如:

print(f"Hello\n{{H\na\nn\nn}}")

Hello

{H

a

n

n}

2. 支持多行字符串

过去的版本中,如果定义的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

3. 支持重复使用的引号种类

新版本中可以在表达式里重复使用f-string使用过的引号种类,不用像老版本中只能在双引里放单引号,单引号里放双引呈。例如:

print(f"重复相同的引号: {"+".join(["1","2","3"])}")

输出:

重复相同的引号: 1+2+3

4. 支持无限嵌套

在新版本中,用户可以无限地嵌套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.


附录

Python3.12新语法特性

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 方法别名。

目录
相关文章
|
2月前
|
测试技术 API Python
Python 3.10 的首个 PEP 诞生,内置类型 zip() 迎来新特性
Python 3.10 的首个 PEP 诞生,内置类型 zip() 迎来新特性
44 2
|
2月前
|
测试技术 程序员 数据库
Python 3.9 beta2 版本发布了,看看这 7 个新的 PEP 都是什么?
Python 3.9 beta2 版本发布了,看看这 7 个新的 PEP 都是什么?
27 0
|
2月前
|
Python
Python 3.10 版本采纳了首个 PEP,中文翻译即将推出
Python 3.10 版本采纳了首个 PEP,中文翻译即将推出
18 3
|
2月前
|
开发者 Python
开发者请注意:Python2 的最后版本将于 4 月发布,但它确实是在 1 月 1 日就寿命终止了!
开发者请注意:Python2 的最后版本将于 4 月发布,但它确实是在 1 月 1 日就寿命终止了!
28 1
|
2月前
|
机器学习/深度学习 PyTorch 算法框架/工具
Python冷知识:如何找出新版本增加或删除了哪些标准库?
Python冷知识:如何找出新版本增加或删除了哪些标准库?
24 0
|
6天前
|
Python
IDA3.12版本的python,依旧报错IDAPython: error executing init.py.No module named ‘impRefer to the message win
IDA3.12版本的python,依旧报错IDAPython: error executing init.py.No module named ‘impRefer to the message win
|
15天前
|
XML 编解码 数据格式
Python标准数据类型-String(字符串)
Python标准数据类型-String(字符串)
23 2
|
20天前
|
Python Windows
【Python】Windows如何在cmd中切换python版本
【Python】Windows如何在cmd中切换python版本
|
1月前
|
安全 Python
Python系列(16)—— string类型转float类型
Python系列(16)—— string类型转float类型
|
1月前
|
Python
Python系列(15)—— int类型转string类型
Python系列(15)—— int类型转string类型