Python 3.10 有哪些最新特性 ?

共 3522字,需浏览 8分钟

 ·

2021-06-25 03:04

Python 3.10 的开发已经稳定下来,我们终于可以测试最终版本中将包含的所有新功能。

下面我们将介绍 Python 3.10 中最有趣的一些新增功能——结构模式匹配、带括号的上下文管理器、 更多类型以及新的报错消息。

结构模式匹配

结构模式匹配是要添加到 Python 中的一个很棒的功能。想象一个如下所示的 if-else 语句(Python 3.9):

  1. http_code = "418"


  2. if http_code == "200":

  3. print("OK")

  4. elif http_code == "404":

  5. print("Not Found")

  6. elif http_code == "418":

  7. print("I'm a teapot")

  8. else:

  9. print("Code not found")

输出:
  1. I'm a teapot

Python 3.10 中可以这样写:
  1. http_code = "418"


  2. match http_code:

  3. case"200":

  4. print("OK")

  5. case"404":

  6. print("Not Found")

  7. case"418":

  8. print("I'm a teapot")

  9. case _:

  10. print("Code not found")

这就是新的 match-case语句——很酷,但目前还没有什么特别之处。使 match-case语句如此有趣的原因是一种称为结构模式匹配的东西。结构模式匹配允许我们执行相同的 match-case 逻辑,但基于我们的比较对象的结构是否与给定的模式匹配。
因此,让我们定义两个字典,它们都具有不同的结构。
  1. dict_a = {

  2. 'id': 1,

  3. 'meta': {

  4. 'source': 'abc',

  5. 'location': 'west'

  6. }

  7. }

  1. dict_b = {

  2. 'id': 2,

  3. 'source': 'def',

  4. 'location': 'west'

  5. }

现在,我们可以编写一个模式来匹配 dict_a,如下所示:
  1. {

  2. 'id': int,

  3. 'meta': {'source': str,

  4. 'location': str}

  5. }

还有一个匹配 dict_b的模式:
  1. {

  2. 'id': int,

  3. 'source': str,

  4. 'location': str

  5. }

如果我们将这两个放在一个 match-case语句中,以及有效的 else/和包罗万象的 case_ - 我们得到:
  1. # loop through both dictionaries and a 'test'

  2. for d in[dict_a, dict_b, 'test']:

  3. match d:

  4. case{'id': ident,

  5. 'meta': {'source': source,

  6. 'location': loc}}:

  7. print(ident, source, loc)

  8. case{'id': ident,

  9. 'source': source,

  10. 'location': loc}:

  11. print(ident, source, loc)

  12. case _:

  13. print('no match')

输出结果:
  1. 1 abc west

  2. 2def west

  3. no match

是不是很酷?我已经发现这对数据处理非常有用。
带括号的上下文管理器
一个较小的变化是新的基于 PEG 的解析器。以前的 Python 解释器有很多限制,这限制了 Python 开发人员可以使用的语法。
Python 3.9 的基于 PEG 的解析器消除了这些障碍,从长远来看,这可能会导致更优雅的语法——这种变化的第一个例子是新的带括号的上下文管理器。在 Python 3.9 之前,我们可以写这样的东西来打开两个(或更多)文件 I/O 流:
  1. with open('file1.txt', 'r') as fin, open('file2.txt', 'w') as fout:

  2. fout.write(fin.read())

第一行很长。但是由于解析器的限制,我们可以将此行拆分为多行的唯一方法是使用 \ 行继续符:
  1. with open('file1.txt', 'r') as fin, \

  2. open('file2.txt', 'w') as fout:

  3. fout.write(fin.read())

它是有效的,但不是很 Pythonic。使用新的解析器,我们现在可以将括号将这一行拆分为多行,如下所示:
  1. with(open('file1.txt', 'r') as fin,

  2. open('file2.txt', 'w') as fout):

  3. fout.write(fin.read())

这种写法很Pythonic。现在,在我们继续,如果我们写:
  1. with(open('file1.txt', 'r') as fin,

  2. open('file2.txt', 'w') as fout):

  3. fout.write(fin.read())

在 Python 3.9 中也可以这样写。这是因为新的解析器启用了这种语法,尽管直到 Python 3.10 才被正式支持。
Typing功能
Python 的输入功能也有更多更新。这里最有趣的添加是包含了一个新的运算符,它的行为类似于类型的 OR 逻辑,我们之前使用 Union 方法来实现:
  1. from typing importUnion


  2. def add(x: Union[int, float], y: Union[int, float]):

  3. return x + y

现在,我们不需要写成 fromtypingimportUnion,并且 Union[int,float] 已经简化为 int|float,看起来更简洁:
  1. def add(x: int| float, y: int| float):

  2. return x + y

更加完善的报错信息
相信你第一次看到时都会去百度或者 Google 搜索:
  1. SyntaxError: unexpected EOF while parsing

输入 SyntaxError 时,Google 中排名第一的结果表明我们中的许多人确实在某个时候做过。

这不是一条明确的报错消息,Python 中充满了不太明确的报错消息。幸运的是,有人注意到了它们——其中许多消息都得到了显著改善。

官方更改列表中提到了更多改动 - 但在测试期间似乎没有显示,包括:
  1. from collections import namedtoplo

  2. > AttributeError: module'collections' has no attribute 'namedtoplo'. Did you mean: namedtuple?

在这里, AttributeError 与之前相同,但增加了一个建议的属性名称—— namedtoplo 被标识为属性 namedtuple的潜在拼写错误。
同样,我们看到 NameError消息也有相同的改进:
  1. new_var = 5

  2. print(new_vr)


  3. > NameError: name 'new_vr'isnotdefined. Did you mean: new_var?

总结
以上是 Python 3.10 引入的一些关键新功能!
完整版本预计于 2021 年 10 月 4 日发布,从现在开始,Python 开发人员将致力于改进已经添加的内容——但不会引入新功能。如果您想自己检查一下,可以从这里下载 3.10.0b1。

https://www.python.org/downloads/release/python-3100b1/

Python猫技术交流群开放啦!群里既有国内一二线大厂在职员工,也有国内外高校在读学生,既有十多年码龄的编程老鸟,也有中小学刚刚入门的新人,学习氛围良好!想入群的同学,请在公号内回复『交流群』,获取猫哥的微信(谢绝广告党,非诚勿扰!)~


还不过瘾?试试它们




提升 Python 性能 - Numba 与 Cython

Python 是用 C 语言实现的,那 C 是用什么语言实现的?

Python工匠:解析容器类型的门道

Python 动态赋值的陷阱

超详细 Pycharm 部署项目视频教程

如何降低 Python 的内存消耗量?


如果你觉得本文有帮助
请慷慨分享点赞,感谢啦
浏览 18
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报