Я не могу вызвать функцию внутри нее после того, как - PullRequest
0 голосов
/ 03 мая 2019

я пытаюсь сделать меню. У меня есть проверка, чтобы не принимать ввод строки. Если числовое значение равно значению, функция работает хорошо, но когда ввод является строкой, что-то идет не так

def menudos(diccionario, titulo):
    os.system('clear')
    list_menu = []
    if diccionario:
        print(titulo)
        for key in diccionario:
            list_menu.append(key)
        list_menu.append("Volver")
        for x in range(0, len(list_menu)):
            print(x, ": ", list_menu[x])
        try:
            opcion = int(input("Seleccionar> "))
        except:
            menudos(diccionario, titulo)
        return list_menu[opcion]

Ошибка в том, что:

Traceback (most recent call last):
  File "menudos.py", line 23, in <module>
    print(menudos(a, "Prueba"))
  File "menudos.py", line 21, in menudos
    return list_menu[opcion]
UnboundLocalError: local variable 'opcion' referenced before assignment

Спасибо

Ответы [ 2 ]

0 голосов
/ 03 мая 2019

Конкретная обратная трассировка вызвана тем, что opcion не определен в блоке исключений, но вы пытаетесь вернуть list_menu[opcion] после прохождения блока исключений.

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

Мой подход к пользовательским меню всегда заключался в том, чтобы разделить печать параметров меню и захватить ввод пользователя.

Что-то вроде:

def print_menu():
    print("Please make a selection:")
    print("1. Do item #1")
    print("2. Do item #2")
    # ...etc....

def get_user_input():
    selection = None
    while selection is None:
        try:
            selection = int(input("Selection: "))
            return selection
        except:
            print("You selected an invalid choice. Please choose again.")
            print_menu()

Надеюсь, это поможет!

Редактировать: Также смотрите этот вопрос по рекурсии в Python .По умолчанию в Python существует ограничение в 1000 рекурсивных вызовов, поэтому, если ваш существующий код сработал, пользователь может ввести 1000 неверных записей и прервать вашу программу.

0 голосов
/ 03 мая 2019

Проблема в том, что когда вы предоставляете не int, программа выдает исключение, пытаясь преобразовать не-int в int, и вашему варианту ничего не присваивается. Если вы хотите защитить вашу программу от сбоев. Выполните оператор try..except в бесконечном цикле, ожидая правильного формата индекса.

...