如何使用字典在python中模拟switch-case

时间:2018-01-10 15:36:02

标签: python python-3.x

我试图从下面的validate_input2函数模拟switch-case语句。

def _validate_inputs2(*args):
    if len(args) == 1:
        stop = args
        start = 1
        step = 1
    elif len(args) == 2:
        start, stop = args
        step = 1
    elif len(args) == 3:
        start, stop, step = args
    else:
        raise TypeError("xxx expected at most 3 arguments, got 4")
    if 0 == step:
        raise ValueError("xxx arg 3 must not be zero")
    return start, stop, step

这是我基本上做的,但它没有正常工作

def _validate_inputs(*args):
    start, stop, step = {
        len(args) == 1: lambda x, y, z: (args, 1, 1),
        len(args) == 2: lambda x, y, z: (args, 1),
        len(args) == 3: args
    }.get(args, lambda: TypeError("xxx expected at most 3 arguments, got 4"))()
    if 0 == step:
        raise ValueError("xxx arg 3 must not be zero")
    return start, stop, step

即使我觉得这种模拟的可读性较差,但我希望能更好地理解它,以提高我的python技能。

有人可以帮我简化这段代码吗?

3 个答案:

答案 0 :(得分:3)

这是一个以你所做的为基础的解决方案:

def _validate_inputs(*args):
    if len(args) > 3:
        raise TypeError("xxx expected at most 3 arguments, got 4")
    else:
        start, stop, step = {
            1: (1,) + args + (1,),
            2: args + (1,),
            3: args
        }.get(len(args))
        if 0 == step:
            raise ValueError("xxx arg 3 must not be zero")
        return start, stop, step

示例输出:

>>> print _validate_inputs(40)
(1, 40, 1)

>>> print(_validate_inputs(10, 20))
(10, 20, 1)

>>> print(_validate_inputs(1, 2, 3))
(1, 2, 3)

修改TypeError在原始帖子中无法正常使用。在这种情况下,您无法在TypeError中返回get()作为未找到的值,因为代码需要解压缩3个值(至少在python 2.x AFAIK中) 。

我已更新代码以处理len(args) > 3的情况。还可以为argsNone或为空的情况添加检查。

>>> print(_validate_inputs(1, 2, 3, 4))
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-302-c2f9c1befae1> in <module>()
----> 1 print(_validate_inputs(1,2,3,4))

<ipython-input-296-769e989711e0> in _validate_inputs(*args)
      1 def _validate_inputs(*args):
      2     if len(args) > 3:
----> 3         raise TypeError("xxx expected at most 3 arguments, got 4")
      4     else:
      5         start, stop, step = {

TypeError: xxx expected at most 3 arguments, got 4

答案 1 :(得分:2)

(不是问题的答案,但可能是解决实际问题的更好方法。)

看起来你正在复制Python slice内置功能的一部分。因此,您只需从slice创建args,然后从中获取startstopstep

>>> args = (2, 4)
>>> s = slice(*args)
>>> start, stop, step = s.start, s.stop, s.step
>>> start, stop, step
(2, 4, None)

这也负责处理错误情况:

>>> args = (1, 2, 3, 4)
>>> slice(*args)    
TypeError: slice expected at most 3 arguments, got 4

答案 2 :(得分:1)

我会尝试这样的事情......

(-123) + (-5) = -128