在长if-elseif-else语句中使用return(Python)
我这里用的是Python作为例子,但我的问题其实是关于编程语言的一般性问题。
def some_function(eggs):
if eggs == 1:
do_something_1()
elif eggs == 2:
do_something_2()
elif eggs == 3:
do_something_3()
else:
do_error()
return
do_something_4()
do_something_5()
do_something_6()
(这只是一个例子。我的函数不会叫做 do_something_x
。)
在else里面加一个return,这样做会算是糟糕的编程习惯吗?把
do_something_4()
do_something_5()
do_something_6()
放在每个if/elif里面会不会更好呢?
5 个回答
3
你觉得这样怎么样:
def some_function(eggs):
if eggs not in [1,2,3]:
do_error()
return
if eggs == 1:
do_something_1()
elif eggs == 2:
do_something_2()
elif eggs == 3:
do_something_3()
else:
assert False
do_something_4()
do_something_5()
do_something_6()
8
绝对不要在每个if
条件里复制一模一样的代码。
那这样怎么样:
def some_function(eggs):
options = {1: do_something_1, 2: do_something_2, 3: do_something_3}
if eggs in options:
options[eggs]()
do_something_4()
do_something_5()
do_something_6()
else:
do_error()
return
这样就不需要写很长的if
、elif
和else
了。而且很清楚,只有当鸡蛋的数量是1、2或3时,do_something_4()
等函数才会被执行。
12
我看到你代码的主要问题是,错误处理的部分藏在函数体的一半之后。这让代码变得难以阅读。因为你是在验证函数的参数,所以应该先处理这个部分。
如果参数无效,我更倾向于抛出一个合适的异常,比如 ValueError
。虽然我不知道你的函数具体做什么,或者 do_error
是干嘛的,但一般来说,函数不能从错误的参数中恢复过来。是调用者提供了这些参数,所以应该让调用者来处理这个错误。
另外,这里有一个可以用来避免长长的 elif
列表的写法:
funs = {1: do_something_1,
2: do_something_2,
3: do_something_3}
funs[eggs]()