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

时间:2011-07-22 21:54:41

标签: python coding-style refactoring if-statement

我使用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。)

在这样的其他方面回归会是一个糟糕的编程习惯吗?

是否更好
do_something_4()
do_something_5()
do_something_6()
每个if / elifs中的

5 个答案:

答案 0 :(得分:11)

我在代码中看到的主要问题是错误情况隐藏在函数体的一半以上。它使代码难以阅读。因为你正在做的是验证函数的参数,你应该先做。

在无效参数的情况下,我的偏好是引发适当的异常,例如ValueError。如果不知道你的功能是什么,或do_error做了什么,很难绝对肯定地说这适用于你的情况。但一般来说,获取不正确的参数并不是函数可以恢复的。来电者提出了论点;所以把责任放在调用者身上以从那个错误中恢复。

此外,这里有一个成语,可以用来避免elif s的长列表:

funs = {1: do_something_1,
        2: do_something_2,
        3: do_something_3}
funs[eggs]()

答案 1 :(得分: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。它也很清楚do_something_4()等只有当蛋是1,2或3时才会发生。

答案 2 :(得分: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()

答案 3 :(得分:2)

您确定do_something_ndo_something_m真正相关吗?

如果是这样,请使用do_something(var, n)并使用相同的代码来处理所有内容(如果所有概念真的相关,对吧?)。

如果没有,请将功能拆分为真正有用且独立的功能。


为什么这(可能)不好的原因:

def print1():
    print(1)

def print2():
    print(2)

好吧,任何人都应该看到这应该是printn(n)或类似的东西。

另一个概率:

def action1():
    paymanagers()
    payworkers()

def action2():
    clean_trashbin()
    unlock_car()

这些行为可能没有关系,应该属于他们自己的职能。

答案 4 :(得分:1)

您现在正在做的是编程实践并不错,但通过在每个if语句中放置三个函数调用来复制代码将是不好的做法。

有些人更喜欢在他们的功能上有一个退出点,在这种情况下我会建议这样的事情:

def some_function(eggs):
    error_code = 0
    if eggs == 1:
        do_something_1()
    elif eggs == 2:
        do_something_2()
    elif eggs == 3:
        do_something_3()
    else:
        do_error()
        error_code = 1

    if error_code == 0:
        do_something_4()
        do_something_5()
        do_something_6()
    return   # return error_code if it would be helpful to the calling function