63 votes

Pourquoi Python n'a-t-il pas de switch-case ?

Veuillez expliquer pourquoi Python ne dispose pas de la fonction switch-case.

3 votes

Ils ne sont pas très utiles. Il est plus sûr de rester avec if... elif que switch . Ils conduisent à des bugs horribles si vous ne faites pas attention.

0 votes

Pour une solution de contournement, vous pouvez vous référer à Y a-t-il un intérêt à implémenter un Switch / Case en Python ?

0 votes

75voto

Raymond Hettinger Points 50330

Mise à jour : Une nouvelle proposition est à l'étude. Voir PEP 622 Correspondance de modèles structurels .


Nous l'avons envisagé à un moment donné, mais sans possibilité de déclarer des constantes nommées, il n'y a aucun moyen de générer une table de saut efficace. Tout ce qui nous resterait serait donc du sucre syntaxique pour quelque chose que nous pourrions déjà faire avec des chaînes if-elif-elif-else.

Voir PEP 275 et PEP 3103 pour une discussion complète.

Le raisonnement est le suivant : les diverses propositions n'ont pas répondu aux attentes des gens quant à ce que switch-case pourrait faire, et elles n'ont pas réussi à améliorer les solutions existantes (comme la répartition basée sur les dictionnaires, les chaînes if-elif, la répartition basée sur getattr, ou la bonne vieille répartition par polymorphisme pour les objets ayant des implémentations différentes pour la même méthode).

6 votes

case 1: est assez constant, mais sans nommé vous devriez utiliser des nombres magiques partout, et nous ne voulons pas d'une construction syntaxique qui encourage les nombres magiques.

2 votes

L'amélioration de la lisibilité est l'un des avantages les plus importants de l'utilisation de la technologie de l'information. switch - quand vous dites "nous nous retrouverions avec du sucre syntaxique" => oui, et c'est principalement ce que les gens demandent - si vous vous méfiez de ne pas améliorer les performances (table de saut efficace), eh bien, quelqu'un qui recherche les performances n'utiliserait probablement pas Python en premier lieu (sinon ce type a un problème), donc je ne le considérerais pas comme un obstacle majeur.

4 votes

Je suis venu à cette question pour savoir pourquoi Python n'a pas de switch-case et maintenant j'ai besoin de savoir pourquoi vous ne pouvez pas non plus déclarer des constantes nommées !

14voto

wim Points 35274

Il y a littéralement une section dans les docs pour répondre à cette question. Voir ci-dessous :

Pourquoi n'y a-t-il pas d'instruction switch ou case en Python ?

TL;DR : alternatives existantes (répartition dynamique via getattr ou dict.get , if / elif chaînes) couvrent très bien tous les cas d'utilisation.

9 votes

Ils couvrent très bien tous les cas d'utilisation, bien sûr, d'une manière laide, peu intuitive et difficile à lire qui diffère étrangement de pratiquement tous les autres langages du monde, mais oui...

6 votes

Je ne vois vraiment pas comment on peut excuser qu'un langage universel n'implémente pas switch (il ne s'agit même pas d'un filtrage avancé, juste d'un simple interrupteur) - cela devrait être l'enjeu, point final, il n'y a pas de discussion à avoir. le fait que ce soit même un sujet de débat me dépasse.

7voto

divenex Points 5192

Mise à jour 2021 : case introduit dans Python 3.10

Correspondance de motifs structurels sera inclus dans Python 3.10 qui sera publié en Octobre 2021 .

Voici la syntaxe générique

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

et voici un exemple simple

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"

6voto

vedant patel Points 57
def f(x):
    return {
        1 : 'output for case 1',
        2 : 'output for case 2',
        3 : 'output for case 3'
    }.get(x, 'default case')   

Vous pouvez utiliser ceci comme switch case en python et si la condition ne correspond pas, il retournera la valeur par défaut.

34 votes

Ne tente pas de répondre à la question " Veuillez expliquer pourquoi python n'a pas de switch-case ? ".

2 votes

Oh oui, TRES pratique d'utiliser ce morceau de code => si intuitif, si propre et si joli. Merci Python.

1voto

user6801759 Points 67

Je me souviens qu'à une époque ancienne, un Larry Walls inexpérimenté avait déclaré que Perl n'avait pas besoin d'une construction de type "case switch" parce qu'elle pouvait être réalisée de la même manière avec : "if - elif - elif .... else". À l'époque, Perl n'était rien d'autre qu'un simple outil de script pour les petits pirates. Bien sûr, le Perl d'aujourd'hui a une construction switch.

Il n'est pas surprenant que quelques décennies plus tard, la nouvelle génération d'enfants avec leurs nouveaux jouets soit condamnée à répéter la même déclaration stupide.

C'est une question de maturité, les gars. Il aura éventuellement une construction de cas. Et quand python aura suffisamment mûri en tant que langage de programmation, comme le FORTRAN/Pascal et le C et tous les langages qui en sont dérivés, il aura même une instruction "goto" :)

BTW. Habituellement, le case switch est traduit en asm par un saut indirect vers la liste d'adresses des cas respectifs. C'est un saut inconditionnel, ce qui signifie qu'il est beaucoup plus efficace que de le comparer d'abord (en évitant les erreurs de prédiction de branche), même dans quelques cas seulement, il est considéré comme plus efficace. Pour une douzaine ou plus (jusqu'à des centaines dans l'extrait de code pour un pilote de périphérique), l'avantage de la construction est incontestable. Je suppose que Larry Walls ne parlait pas assembleur à l'époque.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X