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