La maggior parte delle risposte qui sono piuttosto vecchie, e specialmente quelle accettate, quindi sembra che valga la pena aggiornarle.
Innanzitutto, le FAQ ufficiali di Python coprono questo aspetto e raccomandano la elif
catena per casi semplici e casi dict
più grandi o più complessi. Suggerisce inoltre una serie di visit_
metodi (uno stile utilizzato da molti framework di server) per alcuni casi:
def dispatch(self, value):
method_name = 'visit_' + str(value)
method = getattr(self, method_name)
method()
Le FAQ menzionano anche PEP 275 , che è stato scritto per ottenere una decisione una tantum ufficiale sull'aggiunta di istruzioni switch C-style. Ma quel PEP è stato effettivamente rinviato a Python 3 ed è stato ufficialmente respinto solo come proposta separata, PEP 3103 . La risposta è stata ovviamente no, ma i due PEP hanno collegamenti a informazioni aggiuntive se siete interessati ai motivi o alla cronologia.
Una cosa che è emersa più volte (e può essere vista in PEP 275, anche se è stata ritagliata come una vera raccomandazione) è che se sei davvero infastidito dall'avere 8 righe di codice per gestire 4 casi, rispetto al 6 righe che avresti in C o Bash, puoi sempre scrivere questo:
if x == 1: print('first')
elif x == 2: print('second')
elif x == 3: print('third')
else: print('did not place')
Questo non è esattamente incoraggiato da PEP 8, ma è leggibile e non troppo unidiomatico.
Nel corso di oltre un decennio da quando PEP 3103 è stato respinto, il problema delle dichiarazioni di casi in stile C, o persino della versione leggermente più potente di Go, è stato considerato morto; ogni volta che qualcuno lo solleva su python-ideas o -dev, viene riferito alla vecchia decisione.
Tuttavia, l'idea di una perfetta corrispondenza del modello in stile ML nasce ogni pochi anni, soprattutto da quando sono stati adottati linguaggi come Swift e Rust. Il problema è che è difficile sfruttare al meglio la corrispondenza dei pattern senza tipi di dati algebrici. Mentre Guido è stato simpatico all'idea, nessuno ha escogitato una proposta che si adatta molto bene a Python. (Puoi leggere il mio strawman del 2014 per un esempio.) Questo potrebbe cambiare con dataclass
in 3.7 e alcune sporadiche proposte per un enum
tipo di somma più potente da gestire, o con varie proposte per diversi tipi di associazioni locali-dichiarazione (come PEP 3150 , o il serie di proposte attualmente in discussione in -ideas). Ma finora no.
Occasionalmente ci sono anche proposte per l'abbinamento in stile Perl 6, che è fondamentalmente un miscuglio di tutto, dal elif
regex al cambio di tipo a singolo invio.