python 多模式匹配

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

模式匹配是许多编程语言的共同特征,例如C语言中的switch/case 。它允许根据给定变量或表达式的值采取多种可能的操作之一。 尽管Python缺乏用于模式匹配的本机语法,但可以使用if/elif/else链或字典查找对其进行仿真。

PEP 622提出了一种使用match/case语法将表达式与多种模式match/case



match something:
    case 0 | 1 | 2:
        print("Small number")
    case [] | [_]:
        print("A short sequence")
    case str() | bytes():
        print("Something string-like")
    case _:
        print("Something else")



支持的模式匹配类型包括文字,名称,常量值,序列,映射(基本上是表达式中键/值对的存在),类,以上各项的混合或任何这些加上条件表达式。 任何含糊不清或无法解决的匹配都会在运行时引发异常。

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

PEP 622也将允许静态类型检查器来验证是否可以验证匹配。 用于类的新@sealed装饰器指示类型检查器,所涉及类的任何子类都在与基类相同的模块中定义。

由于缺乏大众的支持,以前分别添加模式匹配的PEP(分别在2001年和2006年提出的PEP 275和PEP 3103)被拒绝了。 PEP 3103由Python创建者Guido van Rossum起草。 由van Rossum等人撰写的新PEP旨在提供用于对象匹配的正则表达式,而不是简单的if/elif/else替代品。 作者注意到,该PEP的许多方面都受到了Rust和Scala中模式匹配的工作方式的启发。




如何在引擎盖下实现所有这些仍有待讨论。 PEP 622中提出的实现将生成与if/elif/else链相同的字节码序列。 取决于每种case中包含多少条件逻辑,较大的switch/case块的性能可能会降低。 但是PEP明确指出,仍然有许多方法和性能优化(例如备忘录)。

即使PEP最终被接受,有关它的很多事情也可能会改变。 可能要挑战的一个问题是使用case _:而不是else:作为switch语句的最终包罗万象的子句。 _在许多情况下都用作临时变量,单方面覆盖其行为可能会给开发人员带来麻烦。




翻译自: https://www.infoworld.com/article/3563840/python-may-get-pattern-matching-syntax.html

python 多模式匹配