跳转到主要内容
Chinese, Simplified

Python 已经在市场上出现了很长一段时间,作为一名 Python 开发人员,我很高兴能与大家分享 Python 正在逐步更新并随着每个新版本的发布而改进。
Python 的最新版本 3.10 有一些重大改进,我将在此处列出这些更新。 我在下面捆绑了与这个新版本的 Python 一起发布的前 5 个新更新。


1.改进的错误信息


这个很大。 对于 Python 开发人员,当您编写代码并遇到错误时,错误消息可以帮助您找出代码中的错误。 与使用以前的 Python 版本相比,改进的错误消息使您的生活更加轻松。
例如,考虑以下代码,其中第二行末尾没有括号:

 

# I am coding in Python and this is first line ;)
my_list = ["Hello", "Python!"
print(my_list)

在以前的版本中——Python3.9 和更早的版本,你会看到如下错误——

File "my_precious.py", line 3
print(my_list)
^
SyntaxError: invalid syntax

嗯,语法无效! 现在,作为开发人员,您从这个错误消息中理解了什么? 好吧,就我个人而言,除了在第 3 行的某处添加了错误的语法这一事实之外,我什么都不明白。
但是,错误真的在第 3 行吗?
Python 3.10 是这种情况下的救星,它的最新更新。 对于同一段代码,Python 3.10 将抛出以下错误消息——

File "my_precious.py", line 2
news = ["Hello", "Python!"
^
SyntaxError: '[' was never closed

呜呼! 行号和非常具体的错误消息将允许您直接进入,修复错误并继续编码!
我个人尝试查看错误消息是否足够清晰的另一个示例 -

# missing_comma.py

dc_characters = {
    1: "Superman"       # Comma missing
    2: "Batman",
    3: "Joker"
}....
Output:
File "dc_characters.py", line 4
    10: "October"
        ^^^^^^^^^
SyntaxError: invalid syntax. Perhaps you forgot a comma?

这确实是 Python 3.10 版本中的一个很酷的更新,请在本文的评论部分分享您的想法。


2. 更简单的联合类型语法


Typing 模块用于向 Python 添加静态类型。 在过去的 Python 版本中,更多的工具已经从类型转移到内置功能,以避免每次都必须导入静态类型。
现在让我们看看这里到底发生了什么变化——

# Before Python 3.10 Release
from typing import Union
def f(list: List[Union[int, str]], param: Optional[int]):
    pass# In Python 3.10 Release
def f(list: List[int | str], param: int | None):
    pass# Calling the function
f([1, "abc"], None)

 

在 Python 3.10 中,现在您可以使用管道运算符 (|) 来指定类型联合,而不是从类型模块中导入联合。
此外,现有的 typing.Union 和 | 语法应该与下面的比较相同 -

int | str == typing.Union[int, str]

typing.Union[int, int] == int
int | int == int

3. 跨多行使用多个 `with` 语句


Python 确实通过使用反斜杠 (\) 来支持多行语句,但是 Python 中的一些结构不应该要求使用斜杠来编写多行语句。 其中之一是具有多行 with() 语句的上下文管理器。 例如 -

 

# Before Python 3.10 Releasewith (open("a_really_long_foo") as foo,
      open("a_really_long_bar") as bar):
    pass

Traceback (most recent call last):
  File "<input>", line 1, in <module>
  File "demo.py", line 19
    with (open("a_really_long_foo") as foo,
                                    ^
SyntaxError: invalid syntax

 

是的,这看起来不像是一项功能,但它是对先前版本的一项重大改进,因为您可能遇到过使用多行上下文管理器的用例,但由于上述错误而无法做到这一点。
如果您仍然感到困惑,让我们举更多示例来说明您可以在 Python 3.10 版本中使用上下文管理器做什么——

# After Python 3.10 Releasefrom contextlib import contextmanager

@contextmanager
def f(x):
    try:
        yield x
    finally:
        pass# Example 1
with f('c') as a,
     f('a') as b:
     pass# Example 2
with f('c') as a,
     f('a') as b,
     f('a') as c:
     pass

 

您现在可以拥有多行上下文管理器语句,而无需使用反斜杠。 很棒吧?


4. 更好的类型别名


类型别名允许您快速定义可以为复杂类型声明创建的新别名。 例如 -

# Before Python 3.10
UserInfo = tuple[str, int]

这通常可以正常工作。 但是,类型检查器通常不可能知道这样的语句是类型别名还是只是常规全局变量的定义。

# In Python 3.10from typing import TypeAlias

Card: TypeAlias = tuple[str, str]
Deck: TypeAlias = list[Card]

上面的 python 代码为 tuple[str, str] 声明了一个别名 UserInfo,因为它是一种组合了多种类型值的数据类型。 在我们的例子中,它是一个字符串和一个整数。 此外,添加 TypeAlias 注释可以澄清意图,无论是对类型检查器还是对任何阅读您的代码的人。


5. 更严格的序列压缩


zip() 是 Python 中的一个内置函数,您可能在组合多个列表/序列时使用过它。 Python3.10 引入了新的 strict 参数,它添加了一个运行时测试来检查所有被压缩的序列是否具有相同的长度。
例如 -

# Before Python 3.10
names = ["Tom", "Harry", "Jessica", "Robert", "Kevin"]
numbers = ["21024", "75978", "92176", "75192", "34323"]

zip() 可用于并行迭代这三个列表:

list(zip(names, numbers)).....
Output:
[(Tom, 21024), (Harry, 75978), (Jessica, 92176), (Robert, 75192), (Kevin, 34323)]

让我们再次使用上面显示的这两个序列的名称和编号。 现在,这些序列之间的唯一区别是数字与序列名称的长度不同,如下所示 -

# Before Python 3.10
names = ["Tom", "Harry", "Jessica", "Robert"]     # Kevin is missing
numbers = ["21024", "75978", "92176", "75192", "34323"]# Zipping using zip()
list(zip(names, numbers))......
Output
[(Tom, 21024), (Harry, 75978), (Jessica, 92176), (Robert, 75192)]

请注意,关于名字的所有信息——凯文消失了!
如果您的数据集更大,则很难发现此类错误。 即使你发现有问题,诊断和修复也并不总是那么容易。
被压缩的序列将具有相同长度的假设不仅可以帮助您避免这种差异。
在 Python 3.10 中,strict 参数可以帮助您在一开始就避免这种情况——

# In Python 3.10
names = ["Tom", "Harry", "Jessica", "Robert"]     # Kevin is missing
# Zipping using zip() with additional Parameter strict=True
numbers = ["21024", "75978", "92176", "75192", "34323"]

list(zip(names, numbers, strict=True))....
Output:
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: zip() argument 2 is shorter than argument 1

虽然 strict 并没有真正为 zip() 添加任何新功能,但它可以帮助您避免那些难以发现的错误。


Python 3.10 中的其他更新


这个版本有很多错误修复和一些其他小更新,如果您有兴趣,可以在官方发布页面上找到

原文:https://blog.varunsingh.in/python-3-10-released-top-5-new-features-you-…

本文:https://jiagoushi.pro/node/1910

Tags

Article
知识星球
 
微信公众号
 
视频号