【问题标题】:Pylint not understanding an if/else statement?Pylint 不理解 if/else 语句?
【发布时间】:2021-04-05 14:04:00
【问题描述】:

我有以下示例函数:

def example(inp):
    if not isinstance(inp, list):
        return 'Not list'
    else:
        return 'List'

>>> example('asdf')
'Not list'
>>> example(['asdf',])
'List'

然而pylint 抱怨说:

no-else-return:“return”之后不必要的“else”

为什么会发出这个警告,看起来很傻?

【问题讨论】:

  • 可能是因为如果它返回该值,它将不会继续评估 else 或 sth?
  • 因为如果 if 返回,将代码放在 else 块中是没有意义的 - 查看规则页面,例如 pheanex.github.io/pylint,其中显示了通过和失败的示例。
  • 它确实非常了解if/else。如果您不喜欢,可以禁用警告。
  • Pylint 有时会发表一些愚蠢的意见。让它安静下来。
  • LOL "" 说明了一切。

标签: python python-3.x pylint


【解决方案1】:

因为它相当于这个更短的代码:

if not isinstance(inp, list):
    return 'Not list'
return 'List'

具体来说,当if 的主体以return 结尾时,假条件的代码是否在else 中无关紧要:它只会在@987654325 时执行@条件为假,因为如果条件为真,函数会在if主体的末尾返回。

Pylint 似乎更喜欢更紧凑的版本。但是这两个版本都是完全正确的,我会说有时if/else 版本更清晰。就我个人而言,如果两个主体的大小大致相同,我会使用if/else,如果它的主体很短,我会使用if,而可能的else 主体很长,从而为它节省了缩进级别。奖励:如果你有一个长 if 正文和一个短 else 正文并且 elsereturn 结尾(或者在 if/else 之后的函数中没有更多内容),否定条件并以一个简短的if 正文,没有else

【讨论】:

  • 我明白了,谢谢你的解释。是的,为了便于阅读,我将它作为两个单独的缩进。我也可以将所有内容合并为一行和return 'List' if isinstance(inp, list) else 'Not List'。我不同意这里的 pylint,但无论如何我想这是一种观点,感谢您的详细回答。
  • 我同意,else 版本更适合 IMO。 Pylint 有很多愚蠢的想法,这不是唯一一个。
  • @samuelbrody1249 显然很愚蠢的是:“W1638 ange built-in referenced when not itating when the range built-in is referenced in an non-iterator context (returns an iterator in Python 3) " range 返回一个迭代器是完全错误的。 range 对象是完全可以接受的容器。
  • @AasmundEldhuset python 3 range 对象不是迭代器——你可以多次调用 list ,你可以使用高效的in contains 操作等。
  • @juanpa.arrivillaga:确实——今天我学会了!道歉,并感谢您纠正我。删除了我的评论(为了后人,错误地声称 range 是一个生成器,只能使用一次)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-04-09
  • 1970-01-01
  • 1970-01-01
  • 2017-02-05
  • 2019-12-04
  • 2020-05-13
  • 2015-07-06
相关资源
最近更新 更多