【问题标题】:Why doesn't Python have switch-case?为什么 Python 没有 switch-case?
【发布时间】:2018-03-23 21:17:09
【问题描述】:

请解释为什么 Python 没有在其中实现 switch-case 功能。

【问题讨论】:

标签: python switch-statement


【解决方案1】:

更新: Python 3.10 已接受新语法(超越简单的 case 语句),请参阅 PEP 634 Structural Pattern Matching: Specification


我们曾考虑过它,但如果没有声明命名常量的方法,就无法生成有效的跳转表。所以我们剩下的只是语法糖,我们已经可以用 if-elif-elif-else 链做一些事情。

完整的讨论请参见PEP 275PEP 3103

大致的理由是,各种提案未能达到人们对 switch-case 功能的期望,并且未能改进现有的解决方案(如基于字典的调度、if-elif-chains、基于 getattr分派,或老式的多态性分派给同一方法的不同实现的对象)。

【讨论】:

  • case 1: 是相当恒定的,但如果没有 named 常量,您将不得不在任何地方使用幻数,而且我们不想要鼓励幻数的语法结构.
  • 提高可读性是使用switch 最重要的好处之一——当你说“我们会留下语法糖”=> 是的,这主要是人们所要求的——如果你'提防不提高性能(高效跳转表),好吧,追求性能的人可能不会首先使用 Python(否则这家伙有问题),所以我不会认为它是一个主要的交易破坏者。跨度>
  • 我来这个问题是为了找出 Python 没有 switch-case 的原因,现在我需要找出为什么你也不能声明命名常量!
【解决方案2】:

文档中确实有一个部分可以回答这个问题。见下文:

Why isn’t there a switch or case statement in Python?

TL;DR:现有替代方案(通过getattrdict.getif/elif 链进行动态调度)很好地涵盖了所有用例。

【讨论】:

  • 它们很好地涵盖了所有用例,当然,以一种丑陋、不直观且难以阅读的方式,这与世界上几乎任何其他语言都截然不同,但是是的......跨度>
  • 真的我看不出通用语言没有实现switch的借口(我们甚至不是在谈论高级模式匹配;只是一个普通的',愚蠢- as-f** 开关)——这应该是赌注,期间,没有讨论。事实上,这甚至是一个争论的问题,这超出了我的理解
【解决方案3】:
def f(x):
    return {
        1 : 'output for case 1',
        2 : 'output for case 2',
        3 : 'output for case 3'
    }.get(x, 'default case')   

你可以在python中使用它作为switch case,如果条件不匹配,如果条件不匹配,它将返回默认值

【讨论】:

  • 不尝试回答问题“请解释为什么 python 没有 switch-case?”。
  • 哦,是的,使用那段代码非常方便 => 如此直观、如此干净、如此漂亮。谢谢 Python。
【解决方案4】:

2021 年更新:case 在 Python 3.10 中引入

Structural pattern matching 将包含在Python 3.10 中,将在October 2021 中发布。

这是通用语法

match subject:
    case <pattern_1>:
        <action_1>
    case <pattern_2>:
        <action_2>
    case <pattern_3>:
        <action_3>
    case _:
        <action_wildcard>

这是一个简单的例子

def http_error(status):
    match status:
        case 400:
            return "Bad request"
        case 404:
            return "Not found"
        case 418:
            return "I'm a teapot"
        case _:
            return "Something's wrong with the Internet"

【讨论】:

    【解决方案5】:

    我记得在古代,一个没有经验的 Larry Walls 说 Perl 不需要 case switch 构造,因为它可以用相同的方式完成:“if - elif - elif .... else”。那时 Perl 只不过是黑客小子的脚本工具。当然,今天的 Perl 有一个 switch 结构。

    不出意料的是,几十年后,带着新玩具的新一代孩子注定要重复同样的愚蠢言论。

    这一切都与成熟有关,男孩们。它最终将有一个案例构造。而当python作为一种编程语言已经足够成熟时,比如FORTRAN/Pascal和C以及从它们派生的所有语言,它甚至会有一个“goto”语句:)

    顺便说一句。通常,case switch 被翻译为 asm 作为间接跳转到各个 case 的地址列表。这是一个无条件跳转,意味着比首先比较它更有效(避免分支错误预测失败),即使在它被认为更有效的几种情况下也是如此。对于十几个或更多(多达数百个设备驱动程序的代码 sn-p),该构造的优势是毋庸置疑的。我猜拉里·沃尔斯当时没有谈论装配。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-07-23
      • 2021-12-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-14
      相关资源
      最近更新 更多