Skip to main content
 首页 » 编程设计

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

2025年05月04日15findumars

我正在尝试从下面的 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 技能。

谁能帮我简化这段代码?

请您参考如下方法:

这是一个基于您所做的解决方案:

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 的情况。还可以为 args 为 None 或为空的情况添加检查。

>>> 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