本文解释了 Python 3.10 中与 3.9 相比的新特性。
带括号的上下文管理器:
现在支持使用括号在上下文管理器中跨多行继续。这允许以类似于以前使用 import 语句可能的方式在多行中格式化一长串上下文管理器。例如,所有这些示例现在都有效:
with (CtxManager() as example): ...
with ( CtxManager1(), CtxManager2() ): ...
with (CtxManager1() as example, CtxManager2()): ...
with (CtxManager1(), CtxManager2() as example): ...
with ( CtxManager1() as example1, CtxManager2() as example2 ): ...
with ( CtxManager1() as example1, CtxManager2() as example2, CtxManager3() as example3, ):
|
这种新语法使用了新解析器的非 LL(1) 能力。查看PEP 617了解更多详情。
结构模式匹配
增加match和case语句实现结构模式匹配,模式匹配使程序能够从复杂的数据类型中提取信息,在数据结构上进行分支,并根据不同形式的数据应用特定的操作。
模式匹配的通用语法是:
match subject: case <pattern_1>: <action_1> case <pattern_2>: <action_2> case <pattern_3>: <action_3> case _: <action_wildcard>
|
match 语句采用表达式并将其值与作为一个或多个 case 块给出的连续模式进行比较。具体来说,模式匹配通过以下方式运作:
- 使用具有类型和形状的数据 (the subject)
- 评估subject的match声明
- case从上到下将主题与语句中的每个模式进行比较,直到确认匹配为止。
- 执行与确认匹配的模式相关联的操作
- 如果未确认完全匹配,则最后一种情况,通配符_(如果提供)将用作匹配情况。如果未确认完全匹配且不存在通配符大小写,则整个匹配块为空操作。
简单模式:匹配文字
让我们把这个例子看作是最简单形式的模式匹配:一个值,主题,与几个文字匹配,模式。在下面的示例中,status是 match 语句的主题。模式是每个 case 语句,其中文字表示请求状态代码。匹配后执行与案例相关的操作:
def http_error(status): match status: case 400: return "Bad request" case 404: return "Not found" case 418: return "I'm a teapot" case _: return "Something's wrong with the internet"
|
如果上述函数传递了status418 的a ,则返回“我是茶壶”。如果上面的函数传递了status500 的 a,则 case 语句 with _将作为通配符匹配,并返回“互联网出现问题”。请注意最后一个块:变量名称 "_" 充当通配符并确保始终匹配。
您可以使用|(“or”)在单个模式中组合多个文字:
case 401 | 403 | 404: return "Not allowed"
|
结合类使用:
class Point: x: int y: int
def location(point): match point: case Point(x=0, y=0): print("Origin is the point's location.") case Point(x=0, y=y): print(f"Y={y} and the point is on the y-axis.") case Point(x=x, y=0): print(f"X={x} and the point is on the x-axis.") case Point(): print("The point is located somewhere else on the plane.") case _: print("Not a point")
|
可以在模式中添加一个if子句,称为“守卫Guard”。如果守卫为假,match则继续尝试下一个案例块。
match point: case Point(x, y) if x == y: print(f"The point is located on the diagonal Y=X at {x}.") case Point(x, y): print(f"Point is not on the diagonal.")
|
更多点击标题