Coding style 首选Python(或者任何语言)风格:if返回时是否应该使用else?
很简单的问题: 特别是在Python中(因为Python实际上有中指定的“强烈推荐”样式指导原则,但实际上这适用于任何语言),具有总是返回的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
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解决方案。