2011-02-10 10 views
6

Soy un 'neófito de pitón' y trato de entender el funcionamiento interno del tipo de datos del diccionario. Anoche intenté usar uno como estructura de control (es decir, declaración de cambio) para la entrada del teclado en un programa OpenGL.Python: Usar un diccionario como interruptor no funciona

El problema fue que por alguna razón el diccionario siguió evaluando TODOS los casos (dos en este caso) en lugar de solo el de la tecla presionada.

Aquí es una pieza de código de ejemplo:

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

pasé una hora o más ayer por la noche tratando de encontrar la respuesta a por qué se evalúa cada 'caso', Tengo algunas ideas, pero no fue capaz de encontrar claramente la respuesta a la pregunta "por qué".

Entonces, ¿alguien sería tan amable de explicarme por qué cuando presiono la tecla 'n' (la representación ascii es 110) que este fragmento de código también evalúa la entrada debajo de 27 (la tecla ESC)?

Disculpe si este tema ha sido golpeado hasta la muerte pero lo miré y no pude encontrar la respuesta clara fácilmente (quizás me lo perdí).

Gracias.

Respuesta

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

En este caso, usted está construyendo un diccionario que contiene el valor de retorno de "discoMode()" asignado al 110, y el valor de retorno de la "salida()" a 27.

lo que quería decir escribir era:

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

que asignará 110 a la discoMode función (no llamar a la función!), así mismo para la salida. Recuerde que las funciones son objetos de primera clase: se pueden asignar, almacenar y llamar desde otras variables.

15

No debe llamar a las funciones. Sólo almacenar la función en sí objetos en el diccionario, no sus valores de retorno:

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

f() es una llamada a la función f y evalúa el valor devuelto por esta llamada. f es el objeto de función en sí.

+0

Y asegúrese de que el valor para 'default' sea también un objeto de función (es decir, que llamar' default() 'es legal y hace algo sensible.) –

0

Simplemente elimine los paréntesis, por lo que hace referencia a la función en lugar del resultado de la llamada a la función. De lo contrario, diga explícitamente: "llame a esta función para obtener el valor asociado a esta clave".

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