我试图从下面的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技能。
有人可以帮我简化这段代码吗?
答案 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
的情况。还可以为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
答案 1 :(得分:2)
(不是问题的答案,但可能是解决实际问题的更好方法。)
看起来你正在复制Python slice
内置功能的一部分。因此,您只需从slice
创建args
,然后从中获取start
,stop
和step
。
>>> 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