可能重复:
python中switch语句的替换?
假设我在 Python 中有一个列表:
list = ('ADD', 'SUB', 'PUSH', 'POP')
我想根据输入运行一个函数,该输入可以是列表中的任何值。
除了为 中的每个元素编写 switch case 语句之外list
,还有更紧凑的编写方式吗?
我的理由是列表在未来增长的情况。
可能重复:
python中switch语句的替换?
假设我在 Python 中有一个列表:
list = ('ADD', 'SUB', 'PUSH', 'POP')
我想根据输入运行一个函数,该输入可以是列表中的任何值。
除了为 中的每个元素编写 switch case 语句之外list
,还有更紧凑的编写方式吗?
我的理由是列表在未来增长的情况。
好吧, Python中没有 switch/case 语句。
对于一个小的list
,你想使用if
/ 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))
对于较大的list
,您要确保每个案例都是一个函数(我已经在上面假设了,但是如果您有类似 的代码,则return args[0] + args[1]
必须将其更改为do_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 中,函数是可以像任何其他对象一样传递的普通对象。因此,您可以将它们存储在 adict
中,从 中检索它们dict
,然后仍然调用它们。
顺便说一句,这一切都在常见问题解答中进行了解释,以及一些额外的幻想。
如果你有一些你想调用而不是引发错误的默认函数,很明显如何使用 // 链来做到这一点if
,elif
但else
你如何使用dict
地图来做到这一点?您可以通过将默认函数放入except
块中来做到这一点,但有一种更简单的方法:只需使用以下dict.get
方法:
def do_stuff(x, *args):
return func_map.get(x, do_default)(*args)
您也可以使用这样的模式(匆忙,所以无法清理 atm):
>>> class Test(object):
... def test_FOO(self):
... print 'foo'
...
... def test_BAR(self):
... print 'bar'
...
>>> def run_on(cls, name):
... getattr(cls, 'test_%s' % name)()
...
>>> run_on(Test(), 'FOO')
foo