Переключатель Python недоступен

Я пытаюсь сделать простое отображение словаря, но получаю сообщение об ошибке, указывающее, что switcher недоступен.

def option_select(option):
    switcher = {
        1: "Option One",
        2: "Option Two",
        3: "Option Three",
        4: "Option Four",
        0: sys.exit()
    }
    return switcher.get(option, "Invalid choice")


print("Please select an option:")
print("1: Add a new student.")
print("2: Delete an existing student.")
print("3: List all students.")
print("4: Search for a student.")
print("0: Exit")
optionChoice = int(input("Selection: "))

option_select(optionChoice)

Определение switcher выполнит sys.exit() и ваша программа завершится.

khelwood 17.07.2019 11:39

Не могли бы вы объяснить эту логику дальше? Почему, если в качестве аргумента указано 1, оно все равно упадет до 0?

Colin747 17.07.2019 11:39

Было бы больше смысла, если бы все значения были функциями, то есть switcher = {1: do_foo, 2: do_bar, ..., 0: sys.exit}. (Примечание: нет ())

tobias_k 17.07.2019 11:41

@ Colin747 Потому что это не утверждение switch. Это словарь. Ваше определение создает весь словарь, а не только тот бит, который вы в конечном итоге используете.

khelwood 17.07.2019 11:50
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
4
73
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Определение switcher выполнит sys.exit() и ваша программа завершится.

Использование вами switcher не является оператором переключения; это словарь, в котором вы сопоставляете ключ 0 с возвращаемым значением sys.exit(). Чтобы определить это значение и создать словарь, выполняется sys.exit(). sys.exit() закрывает вашу программу.

Самое простое исправление - просто разобраться с выходом отдельно:

def option_select(option):
    if option==0:
        sys.exit()
    switcher = {
        1: "Option One",
        2: "Option Two",
        3: "Option Three",
        4: "Option Four",
    }
    return switcher.get(option, "Invalid choice")

Или вы можете написать свой switcher так, чтобы каждое значение можно было вызывать:

switcher = {
    1: add_student,
    2: delete_student,
    3: list_students,
    4: search_students,
    0: sys.exit,
}

и определить значения как функции, а затем вы можете вызов результат, который вы получаете из словаря, делать все, что он должен делать.

Например.

switcher[option]()

Теперь у меня есть следующее, но если я укажу 1 в качестве опции, он все равно будет вызывать 1 и 2 - правильно ли это использовать? (Я работаю с Java и пытаюсь использовать это как оператор переключения. switcher = { 1: create_new_student(), 2: test_function(), 0: sys.exit }

Colin747 17.07.2019 11:55

Нет, уберите (). В противном случае вы вызываете функцию во время определения словаря.

khelwood 17.07.2019 11:59

Я пробовал это, но функция, похоже, не вызывается, когда я передаю 1 в качестве опции.

Colin747 17.07.2019 11:59

Вы можете вызвать его после того, как получите его из словаря. Например. switcher[option]().

khelwood 17.07.2019 12:00

Хорошо, похоже, это работает. Я предположил, что вы имели в виду что-то вроде return switcher[option]()

Colin747 17.07.2019 12:03

Другие вопросы по теме