6

我无法运行此代码:

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

match我在 Python 中找不到关键字。

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

任何想法?

4

4 回答 4

11

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

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

截至 2021 年初,match已发布的 Python 版本 <= 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)
于 2021-01-30T19:08:38.857 回答
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 月提供,因此暂时不要在此功能上构建您的生产堆栈。但是,如果您想尝试未来的概念,您今天就可以这样做。

于 2021-03-15T09:04:48.850 回答
2

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

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

于 2021-01-30T19:17:42.090 回答
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 语言的一个很好的补充。”

于 2021-02-18T21:27:58.367 回答