如何修复:Python 中的 "Switch" 语句无法识别输入字符串
How to fix: "Switch" statement in Python doesn't recognise input string
我需要解析客户给出的一些动作。动作是一个包含单词动作的简单字符串:“加载”、“开始”、“暂停”、....
我来自C世界,我是Python的新手。我需要一个 switch 语句,我用 switcher.get() 函数完成了它(见下面的代码)。
问题是这个切换器不能只识别字符串 'load',其他字符串可以正常工作(见下面的输出示例)。
为什么?
为了正确分析问题,我只给出了切换器案例,因为其余代码都可以工作,但对这部分没有用。
我尝试将字符串 'load' 直接提供给该函数,但它直接转到“未找到命令”除外区域“
”
switcher={
'load': partial(load_wav,message_tocheck),
'start': partial(start_wav,message_tocheck),
'pause': partial(pause_wav,message_tocheck),
'resume': partial(resume_wav,message_tocheck),
'stop': partial(stop_wav,message_tocheck),
'reset': partial(reset_ch,message_tocheck),
'mqtt': partial(mqttrun),
'help': partial(help),
'zero':lambda:'lambda'
}
try:
func=switcher.get('load','INVALID')
return func()
except:
print('-------- COMMAND NOT FOUND --------')
输出:
- 加载(不工作):
--------未找到命令--------
- 开始(工作):
限制:A = 0,B = 8,C = 0,D = 8
等待样本 = 690
通道 0 上的 LED 矩阵。刺激 运行...
- 帮助(工作):
----------------帮助----------------
可能的命令是:
插入所有可能的主题进行订阅
----------------帮助----------------
如您所见,唯一不起作用的字符串是加载。问题是我无法将 'load' 单词更改为另一个单词。
有no way,switcher.get('load')
产生异常,所以一定是下面的函数调用。
试试这个:
func = switcher.get('load')
if func is None:
raise ValueError("Command not found")
func() # at this point `func` is a valid member of `switcher`, but it still can raise exceptions
为什么带有 try/except
的代码不起作用:
try
块包含对 func
的调用,这可能引发异常。另外,可能在某些时候字典 不 包含你正在寻找的键,所以 get
returns 一个字符串, which你最终调用了,这是不可能的,所以你得到了一个例外。
如果您想使用 try/except
,请添加 else
子句:
try:
func = switcher['load']
except KeyError:
raise ValueError("Command not found")
else:
# no exception was raised
func()
我需要解析客户给出的一些动作。动作是一个包含单词动作的简单字符串:“加载”、“开始”、“暂停”、....
我来自C世界,我是Python的新手。我需要一个 switch 语句,我用 switcher.get() 函数完成了它(见下面的代码)。
问题是这个切换器不能只识别字符串 'load',其他字符串可以正常工作(见下面的输出示例)。
为什么?
为了正确分析问题,我只给出了切换器案例,因为其余代码都可以工作,但对这部分没有用。 我尝试将字符串 'load' 直接提供给该函数,但它直接转到“未找到命令”除外区域“
”switcher={
'load': partial(load_wav,message_tocheck),
'start': partial(start_wav,message_tocheck),
'pause': partial(pause_wav,message_tocheck),
'resume': partial(resume_wav,message_tocheck),
'stop': partial(stop_wav,message_tocheck),
'reset': partial(reset_ch,message_tocheck),
'mqtt': partial(mqttrun),
'help': partial(help),
'zero':lambda:'lambda'
}
try:
func=switcher.get('load','INVALID')
return func()
except:
print('-------- COMMAND NOT FOUND --------')
输出:
- 加载(不工作):
--------未找到命令--------
- 开始(工作):
限制:A = 0,B = 8,C = 0,D = 8
等待样本 = 690
通道 0 上的 LED 矩阵。刺激 运行...
- 帮助(工作):
----------------帮助----------------
可能的命令是:
插入所有可能的主题进行订阅
----------------帮助----------------
如您所见,唯一不起作用的字符串是加载。问题是我无法将 'load' 单词更改为另一个单词。
有no way,switcher.get('load')
产生异常,所以一定是下面的函数调用。
试试这个:
func = switcher.get('load')
if func is None:
raise ValueError("Command not found")
func() # at this point `func` is a valid member of `switcher`, but it still can raise exceptions
为什么带有 try/except
的代码不起作用:
try
块包含对 func
的调用,这可能引发异常。另外,可能在某些时候字典 不 包含你正在寻找的键,所以 get
returns 一个字符串, which你最终调用了,这是不可能的,所以你得到了一个例外。
如果您想使用 try/except
,请添加 else
子句:
try:
func = switcher['load']
except KeyError:
raise ValueError("Command not found")
else:
# no exception was raised
func()