2011-02-10 13 views
6

Sono un "neofita di Python" e sto cercando di cogliere i meccanismi interni del tipo di dati del dizionario. La scorsa notte stavo tentando di usarne uno come struttura di controllo (vale a dire l'istruzione switch) per l'input da tastiera su un programma openGL.Python: utilizzo di un dizionario come interruttore non funzionante

Il problema era che per qualche motivo il dizionario continuava a valutare TUTTI i casi (due in questo caso) anziché solo quello dal tasto premuto.

Ecco un pezzo esempio di codice:

def keyboard(key): 
    values = { 
    110: discoMode(), 
    27: exit() 
    } 
    values.get(key, default)() 

ho passato un'ora o più scorsa notte cercando di trovare la risposta al perché ogni 'caso' viene valutata, ho un paio di idee, ma non è stato in grado di trovare chiaramente la risposta alla domanda "perché".

Quindi, qualcuno dovrebbe essere così gentile da spiegarmi perché quando premo il tasto 'n' (la rappresentazione ascii è 110) che questo pezzo di codice valuta anche la voce sotto 27 (il tasto ESC)?

Scusa se questo argomento è stato picchiato a morte ma ho guardato e non sono riuscito a trovare facilmente la risposta chiara (forse l'ho perso).

Grazie.

risposta

3
def keyboard(key): 
    values = { 
    110: discoMode(), 
    27: exit() 
    } 

In questo caso, si sta costruendo un dict che contiene il valore di ritorno di "discoMode()" assegnato a 110, e il valore di ritorno di "exit()" a 27.

Cosa volevi dire scrivere era:

def keyboard(key): 
    values = { 
    110: discoMode, 
    27: exit 
    } 

Quale assegnerà 110 alla funzione discoMode (non chiamare la funzione!), allo stesso modo per l'uscita. Ricorda che le funzioni sono oggetti di prima classe: possono essere assegnati, memorizzati e richiamati da altre variabili.

15

Non chiamare le funzioni. Basta memorizzare la funzione stessa degli oggetti nel dizionario, non i loro valori di ritorno:

def keyboard(key): 
    values = { 
     110: discoMode, 
     27: exit 
    } 
    values.get(key, default)() 

f() è una chiamata alla funzione f e restituisce il valore di ritorno di questa chiamata. f è l'oggetto funzione stesso.

+0

Ed essere sicuri che il valore per 'default' è anche un oggetto funzione (cioè, che la chiamata' default() 'è legale e fa qualcosa di sensato.) –

0

Basta rimuovere le parentesi, quindi si fa riferimento alla funzione anziché al risultato della chiamata alla funzione. Altrimenti, dici esplicitamente: "chiama questa funzione per ottenere il valore da associare a questo tasto".

def keyboard(key): 
    values = { 
    110: discoMode, 
    27: exit 
    } 
    values.get(key, default)() 
Problemi correlati