【问题标题】:I can´t call a function inside it after except之后我不能在其中调用函数
【发布时间】:2019-05-03 20:09:13
【问题描述】:

我正在尝试做一个菜单。我有一个不接受字符串输入的验证。如果值是数字,则函数运行良好,但是当输入是字符串时,就会出错

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

谢谢

【问题讨论】:

    标签: python function try-catch except


    【解决方案1】:

    问题是,当您不提供 int 时,程序会引发异常,试图将 non-int 转换为 int,并且没有任何内容分配给您的 var 选项。如果你想保护你的程序不崩溃。在无限循环中执行 try..except 语句,等待索引的正确格式。

    【讨论】:

    • 顺便说一句,提供非 int 作为列表索引本身就是一个错误。如果你想让非 int 索引容器使用字典。
    • 那是我首先做的,并且工作正常,我很高兴没有很多“错误答案”我更喜欢干净的菜单,但如果它不可行,我想我会使用一个无限循环。谢谢
    【解决方案2】:

    具体的回溯是因为opcion没有在except块中定义,但是你在通过except块后试图返回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()
    

    希望这会有所帮助!

    编辑:Also see this question on recursion in Python。默认情况下,Python 中的递归调用限制为 1000 次 - 因此,假设您现有的代码有效,用户可能会输入 1000 个错误条目并破坏您的程序。

    【讨论】:

    • 还要记得检查您的选择是否是有效的索引(如果只有 3 个选项,用户将无法选择 9)
    • 您好,感谢您回答我。以你的方式做的问题是我想要一个我可以在几个字典中使用的函数。所以func的un参数必须是字典...
    猜你喜欢
    • 1970-01-01
    • 2017-03-09
    • 2020-04-24
    • 1970-01-01
    • 2014-09-30
    • 2020-09-16
    • 1970-01-01
    • 1970-01-01
    • 2011-12-15
    相关资源
    最近更新 更多