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

时间:2019-04-07 16:09:58

标签: python-3.x pylint

有了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

关闭警告的所需解决方法:

if CONDITION1:
   return something1
return something2

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

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

2 个答案:

答案 0 :(得分:2)

如果您要遵守Mozilla Coding Style 或类似 那么R1705才有意义。 报价:

  

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

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

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

def max(a, b):
    if a > b:
        return a
    else:
        return b

答案 1 :(得分:1)

post给出了两种不同的设计决策案例:

  1. 保护条款。

    static void Main(string[] args)
            {
                //Rather than making a string you need to split into an array just start with one.
                string[] targetValues = { "One", "Two" };
    
                //You don't need to use Upper Case for String when creating a this list
                List<string> queryValues = new List<string>
                {
                    "One",
                    "Two",
                    "One",
                    "Two",
                    "Three",
                    "Four"
                };
    
                // Comparison done here
                List<string> results = queryValues.Where(x => targetValues.Contains(x)).ToList();
    
                // Seperating the list for the printout for easier viewing 
                Console.WriteLine(string.Join(", ", results));
            }
    

作者认为,对于几种这样的条件,它们的反演和def try_something() if precondition(): result = compute_something() return result else: display_error() return None 更好:

implicit else
  1. 对称子句。

        # 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
    

我同意作者的观点,在这里显性更好。

我还要引用该帖子的评论,其中说,这种选择是范式的选择:

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