Guido van Rossum 提议向 Python 添加模式匹配运算符

吉多·范罗苏姆 提交 供社区审查的草案 规格 用于在 Python 中实现模式匹配运算符(匹配和大小写)。 应该指出的是,添加模式匹配运算符的提案已于 2001 年和 2006 年发布(pep-0275, pep-3103),但被拒绝,赞成优化“if ... elif ... else”构造来编译匹配链。

新的实现非常类似于 Scala、Rust 和 F# 中提供的“match”运算符,它将指定表达式的结果与基于“case”运算符的块中列出的模式列表进行比较。 与 C、Java 和 JavaScript 中可用的“switch”运算符不同,基于“match”的表达式提供了更多功能 广泛的功能。 值得注意的是,所提出的运算符将提高代码的可读性,简化任意 Python 对象的比较和调试,并且由于扩展的可能性,还提高了代码的可靠性。 静态类型检查.

def http_error(状态):
比赛状态:
案例400:
返回“错误请求”
案例401|403|404:
返回“不允许”
案例418:
返回“我是一个茶壶”
案件_:
返回“其他的东西”

例如,您可以解压对象、元组、列表和任意序列,以根据现有值绑定变量。 允许定义嵌套模板,在模板中使用附加“if”条件,使用掩码(“[x, y, *rest]”)、键/值映射(例如,{“bandwidth”: b, “latency ”: l} 提取“带宽”和“延迟”值和字典),提取子模板(“:=”运算符),在模板中使用命名常量。 在类中,可以使用“__match__()”方法自定义匹配行为。

从数据类导入数据类

@数据类
类点:
x:整数
y:整数

def 其中(点):
赛点:
案例点(0, 0):
打印(“原点”)
案例点(0,y):
打印(f“Y = {y}”)
案例点(x,0):
打印(f“X = {x}”)
案例点():
print("在别的地方")
案件_:
print("不是重点")

赛点:
case Point(x, y) 如果 x == y:
print(f"Y=X 在 {x}")
情况点(x,y):
print(f"不在对角线上")

红、绿、蓝 = 0、1、2
搭配颜色:
案例.红色:
print("我看到红色了!")
案例.绿色:
print("草是绿的")
案例.BLU
E:
print(“我感到忧郁:(“)

已准备一套供审核 补丁 具有实验性 执行 提议的规范,但最终版本仍然是 正在讨论中。 例如, 提供 使用关键字“else:”或“default:”代替表达式“case _:”作为默认值,因为“_”在其他上下文中用作临时变量。 同样值得怀疑的是内部组织,它基于将新表达式转换为字节码,类似于用于“if ... elif ... else”构造的字节码,在处理非常大的比较集时,这不会提供所需的性能。

来源: opennet.ru

添加评论