我编写了以下代码,通过用户输入从字典中执行函数。涉及到一个串行连接,这就是为什么稍后会涉及一个关闭串口命令的原因,不要为此烦恼。
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()
答案 0 :(得分:0)
几乎可以肯定的是,你的其他问题正在捕捉到你不期望的其他问题 - 可能是因为ser
未定义而导致名称错误。
但没有意义正在做你正在做的事情; dict[cmd]
已经引发了ValueError;提出这个例外只是为了抓住事情是毫无意义的。完全删除try / except。