Python 结构模式匹配

问题描述

我无法运行此代码

match shape:
    case Point(x,y):
        ...
    case Rectangle(x,y,_,_):
        ...
print(x,y)

我在python中找不到match关键字,

在这里找到它:https://www.python.org/dev/peps/pep-0622/#the-match-statement

...有什么想法吗??

更新:刚刚看到您的回答,像我这样的新 Python 开发人员可能会犯同样的错误,所以我会将这个问题留给可能需要的每个人..谢谢你们,我真的很感谢你们的努力!

解决方法

2021-04-19 更新:Python 3.10 将introduce a structural pattern matching。有关更多详细信息,请参阅其他优秀答案。

您所指的来源是 PEP(Python 增强提案),尚未实施。此外,PEP 已被 PEP634 取代。

截至 2021 年初,match 关键字不存在于任何 Python 版本中,当然也不存在于已发布的 Python 版本

由于 Python 没有任何类似于其他语言中的 switch/case 的功能,您通常会使用嵌套的 if/elif/else 语句或字典。

这是一个基于您的问题的示例,尽管我不是很清楚您想要实现的目标。


class Point:
   def __init__(self,x,y):
       pass

class Rectangle:
   def __init__(self,x1,y1,x2=0,y2=0):
       pass

shapes = dict(
    point=Point,rectangle=Rectangle,)

my_obj = shapes['point'](x,y)
,

截至 2021 年 3 月,结构模式匹配不仅被正式接受,而且在 Python 3.10 的最新 alpha 和开发版本中可用。我上周写了一篇文章 "Get started with Pattern Matching in Python,today!" 详细介绍了如何实现这一点,但我会在这里做一个简短的回顾。

通过 pyenv 安装 3.10-dev/a6

首先确保您已经安装并设置了 pyenv。此时只需做

pyenv install 3.10-dev

您现在可以在本地激活测试版并运行解释器。

pyenv local 3.10-dev
python
Python 3.10.0a6+ (heads/master:87f649a409,Mar 11 2021,16:29:20) [Clang 12.0.0 (clang-1200.0.32.29)] on darwin
Type "help","copyright","credits" or "license" for more information.

通过 docker 容器运行

如果您不关心在本地系统中直接运行 3.10,您也可以使用 docker。新的 alpha 6 已经启动,3.10.0a6 解释器可以很容易地在这样的容器中启动。

docker run -it python:3.10.0a6-buster

这就是在 python 中使用/测试新结构模式匹配的两种不同方法。

注意:这仍是一个早期版本,完整版本将于 10 月发布,因此暂时不要在此功能上构建您的生产堆栈。但是,如果您想尝试未来的概念,现在就可以这样做。

,

PEP 634PEP 635PEP 636 是三个尚未被接受和实施的待定 Python 增强提案。

这意味着它只是请求者希望在未来看到的概念证明,它尚未开发。此外,也无法确定是否会成为 PEP 更像是一个愿望清单。

,

正如其他人所说。

到目前为止还没有实现结构模式匹配。这只是一个 PEP。它最初是 PEP 622,后来变成了 PEP 634PEP 635PEP 636

但是: 截至 2021 年 2 月 8 日,结构模式匹配 PEP 634 及其配套 PEP PEP 635PEP 636 已被 Python 指导委员会接受。

结构模式匹配引起了相当多的争议,但似乎最终还是选择了它,因为在许多现代语言中都存在类似的结构,例如 Haskell、Erlang 和 Scala 以及 Elixir 和 Ruby。 (JavaScript 的提案也在考虑中。)

例如参考article on lwm.net

Python 指导委员会经过一些讨论,接受了 有争议的提议,将模式匹配原语添加到 语。 “我们承认模式匹配是一个广泛的变化 到 Python 并且在整个社区中达成共识是 接近不可能。不同的人有保留或顾虑 围绕语义和语法的不同方面(就像 指导委员会)。尽管如此,经过深思熟虑, 审查围绕这些 PEP 的所有对话,以及竞争 提案和现有民意调查结果,并经过几次面对面的 与 PEP 作者讨论后,我们相信 Pattern PEP 634 等中指定的匹配将是对 Python 语言。”