当前位置: 首页 > 知识库问答 >
问题:

Python结构模式匹配

华佐
2023-03-14

我无法运行此代码:

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

我在Python中找不到匹配关键字。

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

有什么想法吗?

共有3个答案

太叔京
2023-03-14

PEP 634、PEP 635和PEP 636是三个悬而未决的Python增强建议,它们尚未被接受并实施。

这意味着它只是一个概念证明,请求者希望在未来看到它,但它尚未开发出来。此外,也没有任何保证,政治公众人物更倾向于一厢情愿。

麻超
2023-03-14

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

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

pyenv install 3.10-dev

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

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.

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

docker run -it python:3.10.0a6-buster

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

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

奚才良
2023-03-14

更新2021 4月19日:Python 3.10将引入结构模式匹配。有关这方面的更多详细信息,请参阅其他优秀答案。

您所指的源代码是一个PEP(Python增强建议),它还没有在稳定的版本中实现。此外,PEP已被PEP634取代。

截至2021年初,已发布的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)
 类似资料:
  • 我一直在玩Python 3.10中的结构模式匹配,但不知道如何让它匹配一组。例如,我尝试过: 我尝试过: 以及: 我想有一种方法可以做到这一点,因为我们可以匹配其他对象,我只是缺少正确的语法,但我想不出还有什么其他方法可以尝试。任何帮助都将不胜感激!谢谢

  • 字面量 变量 占位符

  • 我正在计算非负p的Lp距离函数。除了p=0和p=∞ 内置的pow()函数可以很好地发挥作用。在学习结构模式匹配之前,我使用了字典和异常处理: 有些人不希望这里有例外。因此,我将该片段改写为以下内容: 为什么大小写inf不正确(Python v3.10.2)?

  • 我有一个字符串,我正试图根据几个regex模式验证它,我希望由于模式匹配在3.10中可用,我可以使用它来代替创建if-else块。 考虑一个字符串'validateString',其可能的值1021102,1.25.32string021。 我尝试的代码如下所示。 对于正则表达式1、2和3,我尝试了字符串正则表达式模式,还重新设置了。编译对象,但它似乎不起作用。 我一直试图在互联网上找到这方面的例

  • 我一直在将if-elif链转换为结构模式匹配,但在反向测试中遇到了困难。 很容易生成与任何支持的模式(文本、类、映射、序列等)匹配的案例。我如何证明一个否定的匹配? 例如,当对象的类型不匹配时,我需要强制它: