La plupart des réponses ici sont assez anciennes, et en particulier les réponses acceptées, il semble donc utile de les mettre à jour.
Tout d'abord, la FAQ Python officielle couvre cela et recommande la elif
chaîne pour les cas simples et la chaîne pour les cas dict
plus grands ou plus complexes. Il suggère également un ensemble de visit_
méthodes (un style utilisé par de nombreux frameworks de serveurs) pour certains cas:
def dispatch(self, value):
method_name = 'visit_' + str(value)
method = getattr(self, method_name)
method()
La FAQ mentionne également PEP 275 , qui a été écrit pour obtenir une décision officielle une fois pour toutes sur l'ajout d'instructions de commutateur de style C. Mais ce PEP a en fait été reporté à Python 3, et il n'a été officiellement rejeté qu'en tant que proposition distincte, PEP 3103 . La réponse était, bien sûr, non, mais les deux PPE ont des liens vers des informations supplémentaires si vous êtes intéressé par les raisons ou l'historique.
Une chose qui est revenue plusieurs fois (et peut être vue dans PEP 275, même si elle a été découpée comme une recommandation réelle) est que si vous êtes vraiment gêné d'avoir 8 lignes de code pour gérer 4 cas, contre les 6 lignes que vous auriez en C ou Bash, vous pouvez toujours écrire ceci:
if x == 1: print('first')
elif x == 2: print('second')
elif x == 3: print('third')
else: print('did not place')
Ce n'est pas exactement encouragé par PEP 8, mais c'est lisible et pas trop unidiomatique.
Plus d'une décennie après le rejet du PEP 3103, la question des déclarations de cas de style C, ou même la version légèrement plus puissante de Go, a été considérée comme morte; chaque fois que quelqu'un en parle sur python-ideas ou -dev, ils sont renvoyés à l'ancienne décision.
Cependant, l'idée d'une correspondance complète des modèles de style ML surgit toutes les quelques années, d'autant plus que des langues comme Swift et Rust l'ont adoptée. Le problème est qu'il est difficile d'utiliser beaucoup la correspondance de modèles sans types de données algébriques. Bien que Guido ait sympathisé avec l'idée, personne n'a proposé une proposition qui s'intègre très bien dans Python. (Vous pouvez lire mon modèle de 2014 pour un exemple.) Cela pourrait changer avec dataclass
en 3.7 et certaines propositions sporadiques pour un plus puissant enum
pour gérer les types de somme, ou avec diverses propositions pour différents types de liaisons instruction-locales (comme PEP 3150 , ou le ensemble de propositions en cours de discussion sur les idées). Mais jusqu'à présent, ce n'est pas le cas.
Il y a aussi parfois des propositions pour la correspondance de style Perl 6, qui est fondamentalement un méli-mélo de tout, de l' elif
expression régulière à la commutation de type à répartition unique.