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

D K*_*D K 7 python refactoring if-statement coding-style

我使用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()
Run Code Online (Sandbox Code Playgroud)

(这只是一个例子.我的函数不会被调用do_something_x.)

像这样在其他方面回归会是一个糟糕的编程习惯吗?放一个更好的主意

do_something_4()
do_something_5()
do_something_6()
Run Code Online (Sandbox Code Playgroud)

在每个if/elifs?

Ben*_*mes 12

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

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

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

funs = {1: do_something_1,
        2: do_something_2,
        3: do_something_3}
funs[eggs]()
Run Code Online (Sandbox Code Playgroud)

  • 甚至`funs.get(eggs,do_error)()`来处理`eggs`不在`funs`中的情况. (3认同)

agf*_*agf 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
Run Code Online (Sandbox Code Playgroud)

这不需要很长时间if elif else.它也很清楚,do_something_4()只有当鸡蛋是1,2或3时才会发生.