接受pylint的R1705的真正好处是什么?代码真的更安全吗?

ale*_*lex 7 pylint python-3.x

有了pylint,我知道在将“ return”放在“ else”中时会触发R1705警告。

这是警告: R1705: Unnecessary "else" after "return" (no-else-return)

这就是文档所说的:

Unnecessary “else” after “return” Used in order to highlight an unnecessary block of code following an if containing a return statement. As such, it will warn when it encounters an else following a chain of ifs, all of them containing a return statement.

触发R1705的代码片段:

if CONDITION1:
   return something1
else:
   return something2

Run Code Online (Sandbox Code Playgroud)

所需的修复程序来关闭警告:

if CONDITION1:
   return something1
return something2
Run Code Online (Sandbox Code Playgroud)

真的需要遵守吗?有什么好处?我的意思是我了解,从函数返回某些内容后,将无法返回并阅读更多代码。

但是我发现使用“ else”更有条理。

J_H*_*J_H 5

如果您尝试遵循Mozilla编码风格 或类似风格,则R1705很有意义。报价:

不要在返回(或休息)后立即输入其他内容。删除else,这是不必要的,并增加了缩进级别。

否则,您可能希望禁用该警告。更好的是,考虑切换到flake8,如果您一直在编写明智的代码,则倾向于保持沉默。

在Mozilla社区之外,大多数人宁愿看到使用来处理简单的并行函数子句else,如下所示:

def max(a, b):
    if a > b:
        return a
    else:
        return b
Run Code Online (Sandbox Code Playgroud)


Yar*_*nko 5

这篇文章给出了此设计决策的两种不同情况:

  1. 守卫条款。

    def try_something()
        if precondition():
             result = compute_something()
             return result
        else:
             display_error()
             return None
    
    Run Code Online (Sandbox Code Playgroud)

作者认为,对于几个这样的条件,它们的反转 和implicit else更好:

    # Implicit else, inverted condition
    def try_something():

        if not precondition_one():
            display_error_one()
            return

        if not precondition_two():
            display_error_two()
            return

        result = compute_something()
        return result
Run Code Online (Sandbox Code Playgroud)
  1. 对称子句。

    # Explicit else
    def check_link(link) -> bool:
        if is_internal_link(link):
            return check_internal_link(link)
        else:
            return check_external_link(link)
    
    Run Code Online (Sandbox Code Playgroud)

我同意作者的观点,这里明确更好。

我还要引用那篇文章的评论,它说这个选择是范式的选择:

  1. “显式 else”:“if-then-else”被视为惰性计算,更适合“功能优先”环境。如果这种“if-then-else”应用于大型数据集和 F#、Scala、Haskel、Closure 甚至 SQL 中的代码 - 显式性是首选。最有可能的是,语言/平台本身会鼓励编写“纯”代码,并阻止/使​​几乎不可能做出命令式的特技。
  2. “隐式 else/(显式返回)”:计算 100% 取决于副作用,结果也是副作用的组合。无论如何,不​​可能保证严格意义上的正确性,因此显式返回成为明确的声明:“由于我们宇宙中的物理定律,此计算可能会不正确。在大多数情况下,将返回此默认值”。