Python: использование словаря в качестве переключателя не работает - PullRequest
6 голосов
/ 10 февраля 2011

Я «неофит питона» и пытаюсь понять внутреннюю работу словарного типа. Прошлой ночью я пытался использовать ее в качестве управляющей структуры (то есть оператора switch) для ввода с клавиатуры в программе openGL.

Проблема заключалась в том, что по какой-то причине словарь продолжал оценивать ВСЕ случаи (два в данном случае) вместо одного из нажатых клавиш.

Вот пример кода:

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

Я потратил час или больше вчера вечером, пытаясь найти ответ на вопрос, почему оценивается каждый «случай», у меня есть несколько идей, но я не смог четко найти ответ на вопрос «почему».

Значит, кто-нибудь будет любезен объяснить мне, почему, когда я нажимаю клавишу 'n' (представление ascii равно 110), этот фрагмент кода также оценивает запись под 27 (клавиша ESC)?

Прошу прощения, если эта тема была избита до смерти , но я посмотрел и не смог легко найти четкий ответ (возможно, я пропустил его).

Спасибо.

Ответы [ 3 ]

15 голосов
/ 10 февраля 2011

Вы не должны вызывать функции. Просто сохраните сами объекты функций в словаре, а не их возвращаемые значения:

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

f() является вызовом функции f и возвращает возвращаемое значение этого вызова. f - это сам объект функции.

3 голосов
/ 10 февраля 2011
def keyboard(key):
  values = {
    110: discoMode(),
    27: exit()
  }

В этом случае вы создаете dict, содержащий возвращаемое значение «discoMode ()», присвоенное 110, и возвращаемое значение «exit ()» - 27.

Что вы хотели написать было:

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

, который назначит 110 функции discoMode (не вызывать функцию!), Аналогично для выхода. Помните, что функции являются объектами первого класса: их можно назначать, хранить и вызывать из других переменных.

0 голосов
/ 10 февраля 2011

Просто удалите скобки, чтобы вы ссылались на функцию, а не на результат вызова функции. В противном случае вы явно говорите: «вызовите эту функцию, чтобы получить значение, связанное с этим ключом».

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