将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