Python 结构模式匹配

问题描述 投票:0回答:4

我无法运行此代码:

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 functional-programming python-3.10 structural-pattern-matching
4个回答
15
投票

2021-04-19 更新:Python 3.10 将引入结构模式匹配。有关更多详细信息,请参阅其他优秀答案。

您所指的来源是PEP(Python增强提案),它尚未在稳定版本中实现。此外,PEP 已被 PEP634 取代。

截至 2021 年初,已发布的 Python 版本中不存在

match
关键字 <= 3.9.

由于 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)

5
投票

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

通过 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 月份提供,因此暂时不要在此功能上构建您的生产堆栈。但如果您想尝试未来的概念,今天就可以这样做。


2
投票

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

这意味着它只是请求者希望在未来看到的概念证明,但尚未开发出来。而且也不能保证它会实现,因为 PEP 往往更多的是一个愿望清单。


0
投票

正如其他人已经说过的。

目前尚未实现结构模式匹配。这只是一个 PEP。最初是 PEP 622,后来变成 PEP 634PEP 635PEP 636

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

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

例如,请参阅lwm.net 上的文章

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

© www.soinside.com 2019 - 2024. All rights reserved.