Coding style 首选Python(或者任何语言)风格:if返回时是否应该使用else?

Coding style 首选Python(或者任何语言)风格:if返回时是否应该使用else?,coding-style,python,Coding Style,Python,很简单的问题: 特别是在Python中(因为Python实际上有中指定的“强烈推荐”样式指导原则,但实际上这适用于任何语言),具有总是返回的if子句的函数是否应该在else子句中具有替代代码?换句话说,以下代码段中的func\u style\u one()和func\u style\u two()完全等效: def func_style_one(): if some_conditional_function(): do_something() return

很简单的问题:

特别是在Python中(因为Python实际上有中指定的“强烈推荐”样式指导原则,但实际上这适用于任何语言),具有总是返回的
if
子句的函数是否应该在
else
子句中具有替代代码?换句话说,以下代码段中的
func\u style\u one()
func\u style\u two()
完全等效:

def func_style_one():
    if some_conditional_function():
        do_something()
        return something()
    else:
        do_something_else()
        return something_else()

def func_style_two():
    if some_conditional_function():
        do_something()
        return something()
    do_something_else()
    return something_else()

显然,最佳和最具可读性的样式取决于具体情况,对于哪种样式更好,意见会有很大差异,但我想问的是,核心Python社区特别喜欢哪种样式。(例如,在所有其他条件相同的情况下,标准库中更常用的是哪一种?

作为经验法则,您应该始终避免给代码增加不必要的复杂性,无论是哪种语言。尝试将代码拆分为语义上有意义的子部分通常也是一个好主意

鉴于这些启发,没有明确的答案。这实际上可以归结为你想要达到的目标

我将用例子来说明这一点

如果我们有一个函数,可以在继续之前检查各种错误条件,那么在没有
else
的情况下编写它是有意义的:

def do_stuff():
    if error1():
        return cleanup_and_fail()
    return ok()
这会更好,因为您通常会以类似的方式按顺序检查多个错误:

def do_stuff():
    if error1():
        return cleanup_and_fail()
    if error2():
        return do_different_cleanup_and_fail()
    return ok()
但是,如果您的函数改为分支到两个相等的分支,则它在语义上对您和其他人更有意义:

def do_stuff():
    if option1():
        return do_option1()
    else:
        return do_option2()
这是因为您经常使用
elif
添加其他几个选项:

def do_stuff():
    if option1():
        return do_option1()
    elif:
        return do_option2()
    else:
        return do_option3()

总而言之:考虑代码的语义并相应地选择语法。

我倾向于选择第二个,我认为第二个更安全。在重构过程中,不太容易将else更改为elif,并且不小心创建了一个没有返回值的代码路径。如果这两个选项相等,我会使用
else
,但是如果
if
部分是一个不太可能的结果,例如使用与断言类似的函数,我会放弃它。这有意义吗?是的,如果我这样说的话,也许我的想法会更清楚。。。如果删除整个
If
块是有意义的,那么请关闭
else
。事实上,通过这种方式,您可以轻松地删除
if
块。但是如果
if
else
都是完整的,没有另一个就没有意义,那么请保留
else
。感谢您的回答。这是我通常做的,我只是想知道是否有任何共识,例如WWGD(Guido会做什么?)。但很高兴知道其他程序员也有类似的想法,至少我这么认为。另外,我真的很感激你接受了PEP 8——人们对风格指南的阅读太少了。然而,风格指南总是软规则——如果手头的问题需要你偏离它们,那么你应该这样做。例如,如果您正在使用类似Java的命名约定扩展Python应用程序,那么最好使用该约定,而不是PEP 8严格建议的约定。对于您在这里给出的琐碎条件返回,我认为映射机制(
options=['opt1',opt'2]return options[opt]
)更清晰、更易于维护。对于更复杂的条件,特别是条件中的进一步嵌套条件,很快就很难确保每个代码路径都有一个返回值,因此为什么方法的最后一行是catchall默认返回,从长远来看,可以更容易地管理。当然,如果默认设置在上下文中没有意义,那么您不应该有默认设置,但是
else
也没有意义。我不同意您的看法。然而,这并没有反驳我的观点,即这个问题没有明确的答案。当然,我也更愿意在很多场合使用无elss解决方案。