网站访问对应二级域名,中煤第一建设公司网站,基于拍卖的拍卖网站开发,网站建设落后发言Python3.10 结构化模式匹配 PEP 634
眼看 2021 马上结束#xff0c;python 发布了它的 3.10 版本#xff0c;优化了错误消息#xff0c;上下文管理器等内容#xff0c;但更吸引我的还是结构化模式匹配。 众所周之 switch 一直是 python 社区呼声比较高的一个功能#xff…Python3.10 结构化模式匹配 PEP 634
眼看 2021 马上结束python 发布了它的 3.10 版本优化了错误消息上下文管理器等内容但更吸引我的还是结构化模式匹配。 众所周之 switch 一直是 python 社区呼声比较高的一个功能这次发布的结构化模式匹配 match 在功能上应该比 Java 或 C 中的这种 switch 强大一点。
match 的语法类似于其他语言的 switch:
def demo(code: int) - str:match code:case 200 | 201 | 202:return OKcase 404:return Not Foundcase _:return Internal Errorif __name__ __main__:print(demo(200))值得注意的是 match 语句中没有 default 关键字而是使用一个 _ 代替。match 会 从上到下 匹配 case 直到匹配成功或遇到 _ 跳出 match 结构. 多个相同行为的匹配项可以使用 | 连接
注意 _ 只能放在最后一个 case 的位置否则会抛出异常
case _:^
SyntaxError: wildcard makes remaining patterns unreachable除了匹配常量 match 还可以匹配变量看官网这个例子
def demo3(pos):match pos:case (0, 0):print(Origin)case (0, y):print(fY{y})case (x, 0):print(fX{x})case (x, y):print(fX{x}, Y{y})case _:raise ValueError(Not a point)if __name__ __main__:demo3((0, 1)) # Y1行为类似于将一个元组解包为 x 和 y 再匹配, 在这种模式下 _ 有了新的用途它可以表示一个通配符如
def demo6(log):match log:case (warning, code, 40):print(A warning has been received.)case (error, code, _):print(fAn error {code} occurred.)if __name__ __main__:demo6((error, 400, 80)) # An error 400 occurred.除此之外 match 还可以根据类的属性进行匹配如下
class Player:def __init__(self, role: int, online: bool):self.role roleself.online onlinedef demo4(p: Player):match p:case Player(role1, onlineFalse):print(role 1 offline)case Player(role1, onlineTrue):print(role 1 online)case _:print(not role 1)if __name__ __main__:demo4(Player(1, True))你甚至可以嵌套使用上面这些特性
def demo5(role: int, online: bool):match [Player(role, online)]:case []:print(empty player box)case [Player(rolerole, onlineFalse)]:print(frole {role} offline)case [Player(rolerole, onlineTrue)]:print(frole {role} online)case _:print(bad player box)if __name__ __main__:demo5(2, False)如果你的匹配条件很复杂你甚至可以像下面这样在 case 语句上加守护项
def demo7(log):match log:case (warning, code, 40):print(A warning has been received.)case (error, code, _) if code in range(400, 500):print(fAn client error {code} occurred.)case (error, code, _) if code in range(500, 600):print(fAn server error {code} occurred.)
if __name__ __main__:demo7((error, 418, 80)) # An client error 418 occurred.demo7((error, 512, 80)) # An server error 512 occurred.总之match 确实能减少某些场合下的开发负担但很害怕未来 Python 为了功能 “全” 而变得越来越复杂和臃肿。
还有一些其他发布的新功能和特性参见 whatnew 3.10