将Python切换重写为更紧凑的方式
  可能重复: 
  python中switch语句的替代? 
假设我在Python中有一个列表:
list =('ADD','SUB','PUSH','POP')
我想根据输入运行一个函数,并且该输入可以是列表中的任何值。
  而不是为list每个元素写一个switch case语句,是否有更紧凑的编写方式? 
我的推理是针对未来名单的增长。
那么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 ,你想确保每个case都是一个函数(我已经假定了上面的,但是如果你有像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中,函数是可以像其他任何对象一样传递的普通对象。  所以,你可以将它们存储在一个dict ,从检索这些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
