19年后,Python可能终于得到了模式匹配语法

2020-06-28 03:56:25

Python语言的创建者正在考虑一项新的提议,即PEP622,该提议最终将为Python带来模式匹配语句语法。新的模式匹配语句将为Python程序员提供更具表现力的方式来处理结构化数据,而不必求助于变通方法。

模式匹配是许多编程语言的共同特性,例如C中的Switch/Case。它允许根据给定变量或表达式的值执行多种可能的操作之一。虽然Python缺乏用于模式匹配的本机语法,但可以使用If/Elif/Else链或字典查找来模拟它。

PEP622提出了一种使用匹配/大小写语法将表达式与多种类型的模式进行匹配的方法:

匹配内容:大小写0|1|2:打印(";小数";)大小写[]|[_]:打印(";短序列";)大小写字符串()|字节():打印(";类似字符串";)大小写_:打印(";其他";)。

支持的模式匹配类型包括文字、名称、常量值、序列、映射(基本上,表达式中存在键-值对)、类、上述类型的混合,或这些加条件表达式中的任何一个。任何不明确或无法解析的匹配都将在运行时引发异常。

对象可以通过称为__MATCH__协议的新协议来处理匹配测试。如果对象实现了__Match__方法,则可以使用它来测试它是否与给定的类模式匹配,并返回适当的响应。

PEP622还将允许静态类型检查器验证匹配是否可以被验证。类的新@Seed修饰符向类型检查器指示相关类的任何子类都是在与基类相同的模块中定义的。

之前增加模式匹配的PEP-2001年和2006年分别提出的PEP 275和PEP 3103-由于缺乏民众支持而被拒绝。PEP3103是由Python的创建者Guido van Rossum起草的。新的PEP由van Rossum和其他几个人编写,旨在为对象匹配提供正则表达式,而不仅仅是简单的if/Elif/Else替代。作者指出,这个PEP的许多方面都受到了Rust和Scala中模式匹配工作方式的启发。

所有这些将如何在幕后实施仍有待讨论。PEP 622中提出的实现将生成与IF/ELIF/ELSE链相同的字节码序列。较大的开关/案例块可能会变得性能较差,这取决于每个案例中包含了多少条件逻辑。但是PEP明确指出,仍有任何数量的方法和性能优化(例如,记忆)仍在讨论中。

即使PEP最终被接受,它的很多方面也可能会发生变化。有一个问题可能会受到挑战,那就是使用Case_:而不是Else:作为THE SWITCH语句的最终通用子句.Case_在许多情况下用作临时变量,单方面覆盖其行为可能会让开发人员望而却步。