Pylint不理解if/else语句?
我有以下示例函数:
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”
为什么它会提出这个看起来很愚蠢的警告?
回答
因为它相当于这个较短的代码:
if not isinstance(inp, list):
return 'Not list'
return 'List'
具体来说,当 an 的主体以 aif结尾时return,假条件的代码是否在 an 中else并不重要:只有在if条件为假时才会执行,因为如果条件为真,函数将在if身体的末端返回。
Pylint 似乎更喜欢更紧凑的版本。但是这两个版本都是完全正确的,我会说有时,if/else版本更清晰。就我个人而言,if/else如果两个主体的大小大致相同,并且仅if当其主体较短而预期else主体较长时,我才会这样做,从而为它节省了缩进级别。奖励:如果你有一个长if体和一个短else体并且以else结束return(或者在 之后的函数中没有更多的东西if/else),否定条件并最终得到一个短if体而不是else。
- I agree, the `else` version is preferable IMO. Pylint has a lot of dumb ideas, this isn't the only one.
- @samuelbrody1249 one that is clearly stupid is: "W1638 ange built-in referenced when not iterating Used when the range built-in is referenced in a non-iterating context (returns an iterator in Python 3)" It's dead wrong about `range` returning an iterator. a `range` object is a perfectly acceptable container.