Palavras-chave: Python, dicionários, switch, case
Algumas pessoas reclamam de que Python não possui uma instrução switch/case, que permite executar trechos de código dependendo do valor de uma determinada variável.
Python realmente não disponibiliza essa funcionalidade, mas podemos simulá-la utilizando funções e dicionários. Para isso basta lembrar que funções e métodos em Python também são objetos. Veja:
def func1(): print "func1" def func2(): print "func2" def func_default(): print "default" switch = { 1: func1, 2: func2, } for case in range(3): try: # chamamos a funcao aqui switch[case]() except KeyError, e: # se nao existe, chamamos o default func_default()
Quando executarmos este exemplo o resultado será:
default func1 func2
Eu gosto de usar a seguinte construção, para evitar o try/except:
switch.get(case, func_default)()
Ou, na tentativa de ser mais explícito e não confundir quem está lendo:
fn = switch.get(case, func_default)
fn()
Po, ehabkost, era exatamente o que eu ia comentar :)
Certa vez em uma lista longínqua eu li o GvR dizendo que o método .get() de dict não era muito pythônico justamente porque permite ocultar a ausência de uma chave em um dicionário.
E pro meu gosto (pessoal e intransferível) usar o .get() prejudica a leitura/entendimento do que está acontecendo.
No meu gosto pessoal, o try/except é que atrapalham o entendimento. :)
Uso bastante o get() porque (na minha opinião) é sucinto sem perder legibilidade.
Outro dia dei esse exemplo no meu mini-curso de python, só foi necessário antes explicar sobre funções de primeira classe, mas foi tranquilo!