深入理解最新Python中的Match Case
有些人仍然认为 Python 不需要“switch-case”语法。 甚至 Guido 本人也不支持在 Python 中添加这种语法。但是,为什么它仍然在这个新版本中发布? 在我看来,原因可以从名称中找到,它被称为“match case”而不是像大多数编程语言那样的“switch case”。
在本文中,我将使用 7 个示例来演示新语法的灵活性和“pythonic”,希望它能帮助你更容易理解它。如果你对 Python 3.10 中的其他功能感兴趣,可以查看之前的文章。喜欢本文点赞支持,欢迎文末加群畅聊。
1. 基础
在任何花哨的东西之前,让我们从这种新语法的基本用例开始。假设我们正在编写一些代码来将 HTTP 状态代码转换为错误消息,我们可以使用 match-case 语法如下:
事实上,对于这个特定的例子,match-case 没有比 if-else 语法带来任何好处,如下所示。
def http_error(status): if status == 400: return "Bad request" elif status == 401: return "Unauthorized" elif status == 403: return "Forbidden" elif status == 404: return "Not found" else: return "Unknown status code"
如果它只能做这样的事情,我认为它不会被添加。 让我们继续用更多的例子来看看它可以有多大的灵活性。
2. 默认情况
它的意思是类似于大多数其他语言中的 switch-case 语法,因此它必须具有“默认情况”。 当没有定义的 case 可以匹配时,将执行“default case”中的代码。
Python以其风格实现了这一要求。 它使用代表匿名变量的下划线“_”。 基本原理是匿名变量可以“匹配”任何东西。
让我们看看下面的例子。
在上面的代码中,我们添加了默认情况并显示“其他错误”。
3. 合并案例
如果有时我们有多个案例需要合并怎么办? 换句话说,这些是不同的情况,但我们处理它们的方式应该是相同的。
在 Python 中,我们可以使用管道“|” 将这些案例合并为一个案例。 它也被视为“或”关系。
在上面的代码中,我们将 401 和 403 错误都视为身份验证问题,因此我们可以将它们组合到匹配案例中。
4. 列表中的通配符
更有趣的事情来了。 假设我们正在使用 match-case 语法编写告警逻辑。它接受一个列表作为参数。 第一个元素是时间。 比如有“早上”、“下午”和“晚上”,第二个元素是我们需要做的动作。
但是,我们可能希望告警提醒我们同时做多件事。 因此,我们希望在列表中传递多个动作,以便告警可以提醒我们将所有动作一一执行。
这是实现这种要求的代码。
在这个例子中,我们只有两种情况。 第一种情况不需要过多解释,因为它只是试图匹配单一动作的情况。 在第二种情况下,我们在变量“actions”前面放了一个星号,这样它就可以匹配列表中的一个或多个动作!
5. 子模式
有时,我们可能希望在模式中包含模式。 具体来说,我们希望匹配案例将流分类为特定的“案例”。 但是,在该模式中,我们想要添加更多限制。
还记得我们已经定义了一天中的“时间”必须是“早上”、“下午”或“晚上”吗? 让我们将此限制添加到匹配案例代码中。 如果“时间”与这 3 项中的一项不匹配,则告诉用户该时间无效。
在上面的代码中,它表明我们可以使用一对括号将我们想要匹配的“模式”括起来,并使用管道来分隔这些模式。
如果它不匹配给定的 3 个“时间”之一,则将执行默认情况。
为什么那里有一个问号? 我故意添加它是因为我想强调解决方案。 通常,匹配子模式之一然后引用它完全匹配的模式并不容易。 但是,我们可以在 Python 中拥有这个“参考”。
让我们添加一个“as”关键字,后跟一个变量,这个变量将作为引用。
6. 条件模式
我们需要让这个告警更加“智能”。 到了晚上,让我们显示一些消息来感谢用户完成一天的工作。因此,我们在上面的代码中又添加了一个 case 来只匹配“evening”。
让我们让这个警报更加智能,以鼓励用户“工作与生活平衡”。 因此,当用户晚上想工作或学习时,闹钟会建议用户休息一下。
7. 匹配对象
到目前为止,我们已经探索了很多, 我猜你可能有这样的感觉,它是“match-case”而不是“switch-case”,因为“pattern”永远是关键。
让我们有一个更复杂的例子。 是的,让我们使用 match-case 来匹配一个对象。
我编一个简单的用例。 创建了一个名为“Direction”的类,用于保持水平(东或西)和垂直(北或南)轴上的方向。
class Direction: def __init__(self, horizontal=None, vertical=None): self.horizontal = horizontal self.vertical = vertical
现在,我们要使用 match-case 语法来匹配来自此类的实例并根据属性显示一条消息。
def direction(loc): match loc: case Direction(horizontal='east', vertical='north'): print('You towards northeast') case Direction(horizontal='east', vertical='south'): print('You towards southeast') case Direction(horizontal='west', vertical='north'): print('You towards northwest') case Direction(horizontal='west', vertical='south'): print('You towards southwest') case Direction(horizontal=None): print(f'You towards {loc.vertical}') case Direction(vertical=None): print(f'You towards {loc.horizontal}') case _: print('Invalid Direction')
然后,让我们从类中创建一些对象进行测试。
d1 = Direction('east', 'south') d2 = Direction(vertical='north') d3 = Direction('centre', 'centre')
结果表明,match-case 可以根据这些对象的属性轻松匹配这些对象!
总结
在本文中,我介绍了 Python 3.10 中引入的新语法“match-case”,以及它是多么灵活和强大。我相信掌握这种新语法将有助于我们在可读性方面编写更好的代码。
技术交流
欢迎转载、收藏、有所收获点赞支持一下!
到此这篇关于深入理解最新Python中的Match Case的文章就介绍到这了,更多相关Python Match Case内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!