为什么Python没有switch-case?

T14*_*412 33 python switch-statement

我是Python的新手.请解释为什么python没有switch-case?

Ray*_*ger 46

我们在某一点上考虑过它,但是如果没有办法声明命名常量,就无法生成有效的跳转表.所以我们剩下的就是语法糖,我们可以用if-elif-elif-else链做.

有关完整讨论,请参阅PEP 275PEP 3103.

大致的理由是,各种提案未能实现人们对切换案例的预期,并且他们未能改进现有的解决方案(如基于字典的调度,if-elif-chains,基于getattr的调度,或者老式的多态性调度到具有相同方法的不同实现的对象).

  • `case 1:`非常常量,但没有*named*常量,你必须在任何地方都使用魔术数字,而且我们不需要一个鼓励魔术数字的语法结构. (3认同)
  • 提高可读性是使用 switch 最重要的好处之一——当你说“我们将只剩下语法糖”=> 是的,这正是人们所要求的——如果你担心不能提高性能(高效)跳转表),好吧,追求性能的人可能一开始就不会使用Python(否则这家伙有问题),所以我不会认为它是一个主要的破坏者。 (3认同)
  • 我提出这个问题是为了找出为什么 Python 没有 switch-case,现在我需要找出为什么你也不能声明命名常量! (3认同)

div*_*nex 10

2021 年更新:casePython 3.10 中引入

结构模式匹配包含在2021 年 10 月发布的Python 3.10中。

这是通用语法

match subject:
    case <pattern_1>:
        <action_1>
    case <pattern_2>:
        <action_2>
    case <pattern_3>:
        <action_3>
    case _:
        <action_wildcard>
Run Code Online (Sandbox Code Playgroud)

这是一个简单的例子

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"
Run Code Online (Sandbox Code Playgroud)


wim*_*wim 8

文档中有一节可以回答这个问题.见下文:

为什么Python中没有switch或case语句?

TL; DR:现有的替代方案(动态调度通过getattrdict.get,if/ elif链)覆盖所有用例.

  • 当然,它们很好地涵盖了所有用例,但以一种丑陋、不直观且难以阅读的方式,与世界上几乎任何其他语言都截然不同,但是,是的…… (8认同)
  • 真的,我不明白通用语言怎么有理由不实现“switch”(我们甚至没有谈论高级模式匹配;只是一个普通的“ol”,愚蠢的**开关) -这应该是赌注,就这样,没有讨论的余地。事实上,这甚至是一个辩论问题,这超出了我的范围 (5认同)

小智 5

def f(x):
    return {
        1 : 'output for case 1',
        2 : 'output for case 2',
        3 : 'output for case 3'
    }.get(x, 'default case')   
Run Code Online (Sandbox Code Playgroud)

您可以将其用作python中的切换条件,如果条件不匹配,则如果条件不匹配,它将返回默认值

  • 不要尝试回答问题“ *,请解释为什么python没有switch-case?*”。 (16认同)
  • 哦,是的,使用那段代码非常方便 =&gt; 如此直观、如此干净、如此漂亮。谢谢Python。 (2认同)