在长if-elseif-else语句中使用return(Python)

7 投票
5 回答
10832 浏览
提问于 2025-04-16 22:06

我这里用的是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

这样就不需要写很长的ifelifelse了。而且很清楚,只有当鸡蛋的数量是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]()

撰写回答