以更紧凑的方式重写Python开关

以更紧凑的方式重写Python开关,python,switch-statement,Python,Switch Statement,可能重复: 假设我有一个Python列表: 列表=('ADD'、'SUB'、'PUSH'、'POP') 我想根据输入运行一个函数,该输入可以是列表中的任何值 除了为列表中的每个元素编写switch case语句,还有更简洁的编写方法吗 我的推理是针对列表将来会增长的情况。好吧,Python中没有switch/case语句 对于一个小的列表,如果/elif,则需要使用: def do_stuff(x, *args): if x == 'ADD': return do_ad

可能重复:

假设我有一个Python列表:

列表=('ADD'、'SUB'、'PUSH'、'POP')

我想根据输入运行一个函数,该输入可以是列表中的任何值

除了为
列表中的每个元素编写switch case语句,还有更简洁的编写方法吗

我的推理是针对列表将来会增长的情况。

好吧,Python中没有switch/case语句

对于一个小的
列表
,如果
/
elif
,则需要使用

def do_stuff(x, *args):
    if x == 'ADD':
        return do_add(*args)
    elif x == 'SUB':
        return do_sub(*args)
    # …
    else:
        raise RuntimeError('Never heard of {}'.format(x))
对于更大的
列表
,您需要确保每个案例都是一个函数(我在上面已经假设过了,但是如果您有类似
return args[0]+args[1]
的代码,您必须将其更改为
do\u add
函数),并创建一个
dict
将名称映射到函数:

func_map = {'ADD': do_add, 'SUB': do_sub, … }

def do_stuff(x, *args):
    try:
        return func_map[x](*args)
    except KeyError:
        raise RuntimeError('Never heard of {}'.format(x))
这是因为在Python中,函数是可以像其他对象一样传递的普通对象。因此,您可以将它们存储在
dict
中,从
dict
中检索它们,然后仍然调用它们

顺便说一句,这些都在中解释了,还有一些额外的幻想

如果您想调用某个默认函数而不是引发错误,那么很明显如何使用
If
/
elif
/
else
链来实现这一点,但是如何使用
dict
映射呢?您可以通过将默认函数放入
except
块来实现,但有一种更简单的方法:只需使用以下方法:

嗯,Python中没有switch/case语句

对于一个小的
列表
,如果
/
elif
,则需要使用

def do_stuff(x, *args):
    if x == 'ADD':
        return do_add(*args)
    elif x == 'SUB':
        return do_sub(*args)
    # …
    else:
        raise RuntimeError('Never heard of {}'.format(x))
对于更大的
列表
,您需要确保每个案例都是一个函数(我在上面已经假设过了,但是如果您有类似
return args[0]+args[1]
的代码,您必须将其更改为
do\u add
函数),并创建一个
dict
将名称映射到函数:

func_map = {'ADD': do_add, 'SUB': do_sub, … }

def do_stuff(x, *args):
    try:
        return func_map[x](*args)
    except KeyError:
        raise RuntimeError('Never heard of {}'.format(x))
这是因为在Python中,函数是可以像其他对象一样传递的普通对象。因此,您可以将它们存储在
dict
中,从
dict
中检索它们,然后仍然调用它们

顺便说一句,这些都在中解释了,还有一些额外的幻想

如果您想调用某个默认函数而不是引发错误,那么很明显如何使用
If
/
elif
/
else
链来实现这一点,但是如何使用
dict
映射呢?您可以通过将默认函数放入
except
块来实现,但有一种更简单的方法:只需使用以下方法:


您也可以使用这样的模式(因为匆忙,所以无法清理):


您也可以使用这样的模式(因为匆忙,所以无法清理):


请参见此处:顺便说一下,您不应该调用变量
list
,因为这是内置
list
类型的名称。(在这种情况下更令人困惑,因为您的对象不是
列表
,而是
元组
),谢谢您的澄清。这么多语言中的这么多术语……哇!请参见此处:顺便说一下,您不应该调用变量
list
,因为这是内置
list
类型的名称。(在这种情况下更令人困惑,因为您的对象不是
列表
,而是
元组
),谢谢您的澄清。这么多语言中的这么多术语……哇@Lattyware:你有一个很好的额外解释,我会偷着去改进我的答案。与其为找不到的密钥提出错误,不如默认为x行吗?@drum:当然,如果你想这样做,你可以这样做。在这种情况下,您可能希望用
映射来替换
try
/
映射[x]
/
,但
除外。获取
。我会编辑答案。@Lattyware:你有一个很好的额外解释,我会偷着它来改进我的答案。如果找不到一个密钥,它会不会导致错误,默认为x?@drum:当然,如果这是你想要的,你可以这样做。在这种情况下,您可能希望用
映射来替换
try
/
映射[x]
/
,但
除外。获取
。我将编辑答案。