Python 3.10 有哪些最新特性 ?
Python 3.10 的开发已经稳定下来,我们终于可以测试最终版本中将包含的所有新功能。
下面我们将介绍 Python 3.10 中最有趣的一些新增功能——结构模式匹配、带括号的上下文管理器、 更多类型以及新的报错消息。
结构模式匹配
结构模式匹配是要添加到 Python 中的一个很棒的功能。想象一个如下所示的 if-else 语句(Python 3.9):
http_code = "418"
if http_code == "200":
print("OK")
elif http_code == "404":
print("Not Found")
elif http_code == "418":
print("I'm a teapot")
else:
print("Code not found")
I'm a teapot
http_code = "418"
match http_code:
case"200":
print("OK")
case"404":
print("Not Found")
case"418":
print("I'm a teapot")
case _:
print("Code not found")
match-case
语句——很酷,但目前还没有什么特别之处。使 match-case
语句如此有趣的原因是一种称为结构模式匹配的东西。结构模式匹配允许我们执行相同的 match-case
逻辑,但基于我们的比较对象的结构是否与给定的模式匹配。
dict_a = {
'id': 1,
'meta': {
'source': 'abc',
'location': 'west'
}
}
dict_b = {
'id': 2,
'source': 'def',
'location': 'west'
}
dict_a
,如下所示:
{
'id': int,
'meta': {'source': str,
'location': str}
}
dict_b
的模式:
{
'id': int,
'source': str,
'location': str
}
match-case
语句中,以及有效的 else/
和包罗万象的 case_
- 我们得到:
# loop through both dictionaries and a 'test'
for d in[dict_a, dict_b, 'test']:
match d:
case{'id': ident,
'meta': {'source': source,
'location': loc}}:
print(ident, source, loc)
case{'id': ident,
'source': source,
'location': loc}:
print(ident, source, loc)
case _:
print('no match')
1 abc west
2def west
no match
with open('file1.txt', 'r') as fin, open('file2.txt', 'w') as fout:
fout.write(fin.read())
\
行继续符:
with open('file1.txt', 'r') as fin, \
open('file2.txt', 'w') as fout:
fout.write(fin.read())
with(open('file1.txt', 'r') as fin,
open('file2.txt', 'w') as fout):
fout.write(fin.read())
with(open('file1.txt', 'r') as fin,
open('file2.txt', 'w') as fout):
fout.write(fin.read())
Typing
功能OR
逻辑,我们之前使用 Union
方法来实现:
from typing importUnion
def add(x: Union[int, float], y: Union[int, float]):
return x + y
fromtypingimportUnion
,并且 Union[int,float]
已经简化为 int|float
,看起来更简洁:
def add(x: int| float, y: int| float):
return x + y
SyntaxError: unexpected EOF while parsing
from collections import namedtoplo
> AttributeError: module'collections' has no attribute 'namedtoplo'. Did you mean: namedtuple?
AttributeError
与之前相同,但增加了一个建议的属性名称—— namedtoplo
被标识为属性 namedtuple
的潜在拼写错误。NameError
消息也有相同的改进:
new_var = 5
print(new_vr)
> NameError: name 'new_vr'isnotdefined. Did you mean: new_var?
https://www.python.org/downloads/release/python-3100b1/
还不过瘾?试试它们
▲提升 Python 性能 - Numba 与 Cython