Есть ли лучший способ написать несколько операторов elif на python?

#python #pygame

Вопрос:

У меня есть фрагмент кода с 18 if / elif утверждениями. is_over это функция, которая определяет, где находится мышь. pos представляет положение мыши, и каждая кнопка представляет собой список значений x, y, ширины, высоты. Вот фрагмент моего кода:

 if is_over(pos, BUTTON_DIVIDE):
    print("/")
elif is_over(pos, BUTTON_MEMORY):
    print("mem")
elif is_over(pos, BUTTON_CLEAR):
    print("clear")
elif is_over(pos, BUTTON1):
    print("1")
elif is_over(pos, BUTTON2):
    print("2")
elif is_over(pos, BUTTON3):
    print("3")
 

Хотя это кажется довольно читабельным, мне интересно, есть ли лучший подход. Я думаю, что мог бы намного лучше сжать этот код с помощью словаря, но я не уверен, как это сделать.

Комментарии:

1. новое match заявление, поступающее в Python 3.10, вероятно, будет очень полезно именно для этого случая

Ответ №1:

Используйте список кортежей и цикл:

 buttons = [
    (BUTTON_DIVIDE, "/") , (BUTTON_MEMORY, "mem"), (BUTTON_CLEAR, "clear"),
    (BUTTON1, "1"), (BUTTON2, "2"), (BUTTON3, "3")]

for button, text in buttons:
    if is_over(pos, button):
        print(text)
        break
 

Можно даже хранить и вызывать функции:

 def divide():
    print("/")

def mem():
    print("mem")

def clear():
    print("clear")

buttons = [(BUTTON_DIVIDE, divide), (BUTTON_MEMORY, mem), (BUTTON_CLEAR, clear)] 

for button, action in buttons:
    if is_over(pos, button):
        action()
        break
 

Комментарии:

1. Очень часто Python расстраивает меня, но, глядя на этот синтаксис, я на самом деле счастливо вздыхаю.