A maioria das respostas aqui são bastante antigas, e especialmente as aceitas, por isso parece valer a pena atualizar.
Primeiro, o FAQ oficial do Python aborda isso e recomenda a elif
cadeia para casos simples e dict
para casos maiores ou mais complexos. Também sugere um conjunto de visit_
métodos (um estilo usado por muitas estruturas de servidor) para alguns casos:
def dispatch(self, value):
method_name = 'visit_' + str(value)
method = getattr(self, method_name)
method()
O FAQ também menciona PEP 275 , que foi escrito para obter uma decisão oficial e definitiva sobre a adição de instruções de chave no estilo C. Mas esse PEP foi realmente adiado para o Python 3, e só foi oficialmente rejeitado como uma proposta separada, o PEP 3103 . A resposta foi, é claro, não - mas os dois PEPs têm links para informações adicionais, se você estiver interessado nos motivos ou na história.
Uma coisa que surgiu várias vezes (e pode ser vista no PEP 275, mesmo que tenha sido cortada como uma recomendação real) é que, se você realmente se incomoda ao ter 8 linhas de código para lidar com 4 casos, em comparação com os 6 linhas que você teria em C ou Bash, você sempre pode escrever isso:
if x == 1: print('first')
elif x == 2: print('second')
elif x == 3: print('third')
else: print('did not place')
Isso não é exatamente incentivado pelo PEP 8, mas é legível e não muito unidiomatic.
Durante mais de uma década desde que o PEP 3103 foi rejeitado, a questão das declarações de caso no estilo C, ou mesmo a versão um pouco mais poderosa em Go, foi considerada morta; sempre que alguém aborda ideias de python ou -dev, elas são encaminhadas para a decisão antiga.
No entanto, a idéia de uma correspondência completa de padrões no estilo ML surge a cada poucos anos, principalmente porque idiomas como Swift e Rust a adotaram. O problema é que é difícil tirar muito proveito da correspondência de padrões sem os tipos de dados algébricos. Embora Guido tenha sido solidário com a idéia, ninguém apresentou uma proposta que se encaixe muito bem no Python. (Você pode ler meu exemplo de 2014 para um exemplo.) Isso pode mudar com o dataclass
item 3.7 e com algumas propostas esporádicas para uma forma mais eficiente enum
de lidar com tipos de soma, ou com várias propostas para diferentes tipos de ligações locais de declaração (como PEP 3150 ou o conjunto de propostas atualmente sendo discutidas em idéias). Mas até agora, não tem.
Ocasionalmente, também existem propostas para a correspondência no estilo Perl 6, que é basicamente uma confusão de tudo, desde elif
regex até comutação de tipo de despacho único.