【问题标题】:Python Structural Pattern MatchingPython 结构模式匹配
【发布时间】:2021-05-04 09:44:45
【问题描述】:

我无法运行此代码:

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

有什么想法吗?

【问题讨论】:

  • "Status: Superseded" 表示链接,也给出了参考实现。
  • 但是.....这里的问题是什么?

标签: python functional-programming python-3.10 structural-pattern-matching


【解决方案1】:

2021 年 4 月 19 日更新:Python 3.10 将 introduce a structural pattern matching。有关详细信息,请参阅其他出色的答案。

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

截至 2021 年初,已发布的 Python 版本 match 关键字。

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

【讨论】:

  • 我花了 20 分钟在 python.org 网站上搜索这个著名的匹配案例 announced as implemented,并在上面找到了 a lot of long philosophical viewseven tutorials,直到我终于找到了你的答案并发现它从来没有实施的。非常感谢。
  • @mins 我对您的评论感到惊讶,特别是在 2021 年 4 月下旬写的时候:“它从未实施”显然是错误的,它只是没有在 中发布稳定的 Python(在您发表评论时)。自 2021 年 5 月 3 日起,您可以在beta version of Python3.10 中下载并尝试模式匹配。
  • @Joël:如果您在提到“尚未实施。此外,PEP 已被 PEP634 取代”时认为最初的答案是错误的,您应该直接你对海报发表评论,而不是我。其余的,您可能会认为测试版是产品的正式版本,有利于生产,但我不会也不会在创建 10 个新问题时使用它来解决一个问题。
  • @Joël 感谢您的反馈!我同意措辞不恰当并进行了一些调整。
  • @mins 你错过了我的观点:海报的答案确定了未实施的内容。在您的评论中,您的句子是“这个著名的匹配案例(...)从未实现过。”,这就是我评论的内容。我的其余评论并不是说想要使用测试版,而只是表明实施正在进行中;-)
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

      正如其他人已经说过的那样。

      目前还没有实现结构模式匹配。这只是一个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 语言。”

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-09-10
        • 2015-08-10
        • 2023-02-09
        • 1970-01-01
        • 2023-04-04
        • 1970-01-01
        • 1970-01-01
        • 2015-03-14
        相关资源
        最近更新 更多