当前位置: 首页 > 知识库问答 >
问题:

将Python开关重写为更紧凑的方式[重复]

蓟和煦
2023-03-14

可能重复:
替换python中的switch语句?

假设我在Python中有一个列表:

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

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

没有为list中的每个元素编写一个开关用例语句,有没有更紧凑的编写方法?

我的理由是,该名单今后会不断增加。

共有2个答案

时衡虑
2023-03-14

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

>>> 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
邓驰
2023-03-14

嗯,在Python中没有开关/案例语句。

对于一个小的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))

对于更大的列表,您需要确保每个案例都是一个函数(我在上面已经假设过了,但是如果您有类似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中检索它们,然后仍然调用它们。

顺便说一句,FAQ中已经解释了这些,还有一些额外的幻想。

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

def do_stuff(x, *args):
    return func_map.get(x, do_default)(*args)
 类似资料:
  • 问题内容: 我有一个表,其数据对的建模如下: 然后总是更大。这些对表示要进行的替换。因此,将100替换为50,然后将50替换为40,然后将其替换为10。 因此结果将是这样的: 有没有一种我可以更改或加入此表来表示的简洁方法? 我知道我可以自己加入类似于以下内容的内容: 但是,这需要多次通过,因此,为什么我问是否有更好的方法来完成它? 问题答案: 结果:

  • 问题内容: 我正在阅读最近发布的The Go Programming Language ,到目前为止,这是一件令人高兴的事情(Brian Kernighan是其中的一位作者,无论如何我都不会期待别的什么)。 我在第3章遇到了以下练习: 练习3.13尽可能紧凑地通过YB 编写KB,MB的声明。 ( 注 :在此上下文中,KB,MB等表示1000的幂) 在此之前有一节,其中介绍了一种有用的常量生成器机制

  • 我试图通过GridBagLayout实现以下目标: 框架将接收一组“字段”(JLabel,JTextField对),我想以“网格状”的方式排列它们,其中一行将包含两个这样的对(JLabel1 JField1 JLabel2 JField2)。当一行包含这四个组件时,下一个组件将添加到另一行。 编辑:我希望组件从面板顶部开始 我的代码生成以下布局。我希望组件的布局更紧凑(尤其是垂直距离) 下面是代码

  • 在解析文件时,我会遍历文件的列标题,看看其中一个是否等于(忽略大小写)compare和: 使用字符集读取该文件: 观察调试器会发现值是非紧凑字符串(UTF-16),而值是紧凑字符串(ASCII): 这是默认行为还是bug?如何使的计算结果为?

  • 这里我有两个类DemoParent和DemoChild,它们扩展了DemoParent,在DemoParent中我有通用方法m1(int I),但在DemoChild中我有varargs方法m1(int…I)。当我创建子类的对象并调用m1方法时,它会给我父类方法输出。请参见下面的输出。o/p-母公司 有人能解释为什么父类方法总是从子类引用调用,即使子类具有相同的方法? 但是如果我们反向代码,即父类

  • 上面的代码是创建魔方的代码。我如何以更简单的形式编写下面的代码,让java初学者能够理解?