2013-03-20 8 views
6

Sto lavorando a un progetto che utilizzava un carico di strutture If, Elif, Elif, ...Else, che successivamente ho modificato per istruzioni switch-like, come mostrato here e here.python - Simulazione di 'else' nelle istruzioni switch di dizionario

Come potrei fare per l'aggiunta di un generale "Hey, questa opzione non esiste" caso simile a un Else in un If, Elif, Else comunicato - qualcosa che viene eseguita se nessuna delle If s o Elif s arrivare a correre?

risposta

5

È possibile rilevare l'errore KeyError che si verifica quando un valore non viene trovato nella mappa e restituire o elaborare un valore predefinito. Ad esempio, con n = 3 questo pezzo di codice:

if n == 1: 
    print 'one' 
elif n == 2: 
    print 'two' 
else: 
    print 'too big!' 

Diventa questo:

choices = {1:'one', 2:'two'} 
try: 
    print choices[n] 
except KeyError: 
    print 'too big!' 

In entrambi i casi, 'too big!' viene stampato sulla console.

+2

Ah, così semplice, come ho fatto a non vederlo in primo luogo! Grazie comunque, sono sicuro che qualcun altro potrebbe ottenere un aiuto anche da questo: P –

+0

Oh, certo. Fammi provare prima - io sono solo un uomo! : P –

7

Se il resto non è davvero una situazione eccezionale, non sarebbe meglio usare il parametro opzionale per ottenere?

>>> choices = {1:'one', 2:'two'} 
>>> print choices.get(n, 'too big!') 

>>> n = 1 
>>> print choices.get(n, 'too big!') 
one 

>>> n = 5 
>>> print choices.get(n, 'too big!') 
too big! 
1

Il first article si è collegato ad aveva una soluzione molto pulita:

response_map = { 
    "this": do_this_with, 
    "that": do_that_with, 
    "huh": duh 
} 
response_map.get(response, prevent_horrible_crash)(data) 

Ciò chiamare prevent_horrible_crash se response non è una delle tre scelte elencate response_map.

0

Supponiamo di avere una funzione f (a, b) e diverse impostazioni di parametri in base al valore di alcune variabili x. Quindi vuoi eseguire f con a = 1 eb = 3 se x = 'Lunedi' e se x = 'Sabato' vuoi eseguire f con a = 5 eb = 9. Altrimenti si stampa che tale valore di x non è supportato.

Farei

from functools import partial 
def f(a,b): 
print("A is %s and B is %s" % (a,b)) 

def main(x): 
switcher = { 
      "Monday": partial(f,a=1, b=3), 
      "Saturday": partial(f, a=5, b=9) 
      } 
if x not in switcher.keys(): 
    print("X value not supported") 
    return 

switcher[x]() 

questo modo f non viene eseguita sulla dichiarazione di switcher ma l'ultima riga.