将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
链接地址: http://www.djcxy.com/p/42761.html

上一篇: Rewriting Python switch into a more compact way

下一篇: how to implement the switch case in python..?