通过用户输入从字典中调用函数 - ValueError引发的次数比我想要的频率高

时间:2017-05-15 13:06:52

标签: python

我编写了以下代码,通过用户输入从字典中执行函数。涉及到一个串行连接,这就是为什么稍后会涉及一个关闭串口命令的原因,不要为此烦恼。

from commands import test1, test2, test3, finangle, Testsequence
    dict = {
       'test1':test1,
       'test2':test2, 
       'test3':test3,
       'finangle':finangle,
       'Testsequence':Testsequence
    }

字典用于限制用户可以通过输入执行的操作。

def select_function(): 
    while True:
        try:
            cmd = input("Now please type in function name. \nType in 'end' to end the program. ")
            if cmd == 'end':
                ser.close() # close serial connection
                print("Connection to serial port " + ser.portstr + " closed.")
                sys.exit()
            if cmd in dict:
                return dict[cmd]()
        except:
            raise ValueError('Invalid input!')

select_function()

据我所知,整个事情必须是一个函数因为我想使用'return'而且这个命令不能在函数之外调用。

所以我尝试让用户选择调用5个函数中的一个或'end',这将关闭串行连接并中止我的其余脚本(sys.exit)。如果用户输入不是'结束'或在字典中是ValueError和'无效输入!'会被提出来! 但是,如果我输入'end'以及'Testsequence'或'finangle',则会引发ValueError。 'test1','test2','test3'工作正常。我100%确定'Testsequence'和'finangle是正确定义的,我检查了好几次。另外我很确定我能正确地写'结束'。谁能看到我做错了什么?

此外,我想在输入无效后给用户第二个选择。他必须被告知这一点。但是,如果我像

那样写
except:
    raise ValueError('Invalid input! Please try again!')
    select_function()

用户获得另一次机会,但不会引发错误消息!我该如何解决这个问题?

修改

问题解决了。我感觉很糟糕,因为这只是对python基础知识的误解。谢谢Daniel Roseman。以下是生成的代码:

def select_function(): # has to be a function because of 'return'
    while True:
        cmd = input("Now please type in function name. \nType in 'end' to end the program. ")
        if cmd == 'end':
                print("Connection to serial port closed.")
                sys.exit()
        if cmd in dict:
                return dict[cmd]()
        else:
            print('Invalid input! Please try again!')
            select_function()

select_function()

1 个答案:

答案 0 :(得分:0)

几乎可以肯定的是,你的其他问题正在捕捉到你不期望的其他问题 - 可能是因为ser未定义而导致名称错误。

没有意义正在做你正在做的事情; dict[cmd]已经引发了ValueError;提出这个例外只是为了抓住事情是毫无意义的。完全删除try / except。