2010-10-20 17 views
7

Eventuali duplicati:
Replacements for switch statement in python?Dato che Python non ha un'istruzione switch, cosa dovrei usare?

sto facendo un po 'di applicazione basata su console in Python e ho voluto usare un'istruzione switch per gestire la scelta degli utenti di una selezione di menu.

Cosa suggerisco di usare. Grazie!

+0

Duplicato di tutti questi: http://stackoverflow.com/search?q=%5Bpython%5D+switch. –

+0

Vedere anche la domanda [l'interruttore in Python non funziona; bisogno di un altro modello] (http://stackoverflow.com/questions/3886641/switch-case-in-python-doesnt-work-need-another-pattern/3893242#3893242). – martineau

risposta

7

Tabelle di distribuzione, o piuttosto dizionari.

Si mappano i tasti aka. valori della selezione del menu alle funzioni che eseguono le seguenti scelte:

def AddRecordHandler(): 
     print("added") 
def DeleteRecordHandler(): 
     print("deleted") 
def CreateDatabaseHandler(): 
     print("done") 
def FlushToDiskHandler(): 
     print("i feel flushed") 
def SearchHandler(): 
     print("not found") 
def CleanupAndQuit(): 
     print("byez") 

menuchoices = {'a':AddRecordHandler, 'd':DeleteRecordHandler, 'c':CreateDatabaseHandler, 'f':FlushToDiskHandler, 's':SearchHandler, 'q':CleanupAndQuit} 
ret = menuchoices[input()]() 
if ret is None: 
    print("Something went wrong! Call the police!") 
menuchoices['q']() 

Ricordarsi di convalidare l'immissione! :)

+3

Quel codice è così sexy che voglio dargli lingerie e farlo posare su Playboy. +1 –

+0

(1) Btw, 'the_input in menu_choices' è una convalida economica che è garantita per essere in sincronia con le scelte effettive. (2) Tutti i gestori di esempio restituiscono 'None', quindi non disturbare la polizia dopo aver eseguito l'esempio;) (3) Come sempre, usare' raw_input' invece di 'input' in Python 2. – delnan

10

Ci sono due opzioni, la prima è la catena standard if ... elif .... L'altro è un dizionario che associa le selezioni ai callables (delle funzioni sono un sottoinsieme). Dipende esattamente da cosa stai facendo quale è l'idea migliore.

catena Elif

selection = get_input() 
if selection == 'option1': 
     handle_option1() 
elif selection == 'option2': 
     handle_option2() 
elif selection == 'option3': 
     some = code + that 
     [does(something) for something in range(0, 3)] 
else: 
     I_dont_understand_you() 

dizionario:

# Somewhere in your program setup... 
def handle_option3(): 
    some = code + that 
    [does(something) for something in range(0, 3)] 

seldict = { 
    'option1': handle_option1, 
    'option2': handle_option2, 
    'option3': handle_option3 
} 

# later on 
selection = get_input() 
callable = seldict.get(selection) 
if callable is None: 
     I_dont_understand_you() 
else: 
     callable() 
+0

Puoi dare un semplice esempio di come utilizzare la mappatura del dizionario? L'esempio di Space_Cowboy non è abbastanza chiaro. –

+1

@sergio: supponiamo di avere le funzioni 'opener' e' closer', ad esempio per aprire e chiudere una finestra. Quindi, per chiamare uno di essi in base a una stringa, fare 'switcher = {" open ": opener," close ": closer}' in modo da avere le funzioni effettive in un 'dict'. Quindi puoi fare 'switcher [choice]()'. – katrielalex

8

utilizzare un dizionario per mappare input per funzioni.

switchdict = { "inputA":AHandler, "inputB":BHandler} 

Dove gli handler possono essere qualsiasi chiamabile. Quindi lo usi in questo modo:

switchdict[input]() 
+0

+1, bello ed elegante :) –