2011-02-10 10 views
6

Jestem "neofitą pytona" i próbuję uchwycić wewnętrzne działanie słownika danych. Ostatniej nocy próbowałem użyć jednego jako struktury kontrolnej (tzn. Instrukcji switch) do wprowadzania klawiatury w programie OpenGL.Python: Używanie słownika jako przełącznika nie działa

Problem to, że z jakiegoś powodu słownik ciągle oceniał WSZYSTKIE przypadki (dwa w tym przypadku) zamiast tylko jednego z wciśniętego klawisza.

Oto przykładowy fragment kodu:

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

spędziłem godzinę lub więcej ostatnią noc próbując znaleźć odpowiedź, dlaczego każdy „przypadek” jest oceniany, mam kilka pomysłów, ale nie był w stanie jednoznacznie znaleźć odpowiedzi na pytanie "dlaczego".

Czy ktoś byłby na tyle uprzejmy, aby wyjaśnić mi, dlaczego po naciśnięciu klawisza "n" (reprezentacja ASCII to 110), ten fragment kodu również ocenia wpis poniżej 27 (klawisz ESC)?

Przepraszam, jeśli ten temat został pobity na śmierć, ale wyglądałem i nie mogłem łatwo znaleźć jasnej odpowiedzi (może tęskniłem za tym).

Dziękuję.

Odpowiedz

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

W tym przypadku, budujesz dict zawierający wartość zwracaną „discoMode()” przypisany do 110 i wartości zwracanej „exit()” do 27.

co masz na myśli napisać było:

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

które przydzieli 110 do discoMode funkcji (nie wywołać funkcję!), podobnie do wyjścia. Pamiętaj, że funkcje są obiektami pierwszej klasy: można je przypisywać, przechowywać i wywoływać z innych zmiennych.

15

Nie powinieneś wywoływać funkcji. Wystarczy zapisać sama obiekty funkcyjne w słowniku, a nie ich wartości zwracanych:

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

f() jest wywołanie funkcji f i ocenia do wartości zwracanej tej rozmowy. f to obiekt funkcji.

+0

I upewnij się, że wartość 'default' jest również obiektem funkcji (to znaczy, że wywołanie' default() 'jest legalne i robi coś sensownego). –

0

Wystarczy usunąć nawiasy, aby odwołać się do funkcji zamiast wyniku wywołania funkcji. W przeciwnym razie wyraźnie powiesz: "wywołaj tę funkcję, aby uzyskać wartość powiązaną z tym kluczem".

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