提问人:zyxue 提问时间:9/6/2020 最后编辑:Rahul Kumarzyxue 更新时间:9/8/2023 访问量:12329
为什么 pylint 在“return”(no-else-return)之后抱怨不必要的“elif”?
why does pylint complain about Unnecessary "elif" after "return" (no-else-return)?
问:
为什么 Pylint 会抱怨这个代码块?
R1705: Unnecessary "elif" after "return" (no-else-return)
def f(a):
if a == 1:
return 1
elif a == 2:
return 2
return 3
为了防止错误,我不得不创建一个临时变量,这感觉不太令人愉快。
def f(a):
if a == 1:
b = 1
elif a == 2:
b = 2
else:
b = 3
return b
解决方案:
def f(a):
if a == 1:
return 1
if a == 2:
return 2
return 3
答:
16赞
Avner Shahar-Kashtan
9/6/2020
#1
块的用途是定义在条件为真时不会执行的代码,因此执行不会继续到下一个块。else
但是,在您的代码中,主条件块有一个 return 语句,这意味着执行将离开函数,因此不需要 else 块:根据定义,如果条件为 true,则返回后的所有后续代码都不会执行。这是多余的。它可以替换为简单的 .if
评论
0赞
Avner Shahar-Kashtan
9/6/2020
elif
是“else if”的缩写。
3赞
zyxue
9/6/2020
但是代码完全没问题,而且很有意义,对吧?这是 Pylint 的限制/错误吗?
1赞
Avner Shahar-Kashtan
9/6/2020
代码包含一个冗余的 else 语句,pylint 会通知你,这正是它的工作。
0赞
zyxue
9/6/2020
明白了。编写此类逻辑的推荐方法是什么?
4赞
Avner Shahar-Kashtan
9/6/2020
只需将 elif 替换为 if - 在这种情况下,它们在语义上是相同的,没有多余的隐式 else。
3赞
Eric Duminil
9/7/2023
#2
pylint 并不总是正确或有帮助的
Pylint 喜欢传递技术上正确但无用的信息。
def f(a):
if a == 1:
return 1
elif a == 2:
return 2
else:
return 3
可能比
def f(a):
if a == 1:
return 1
if a == 2:
return 2
return 3
对于许多用户来说,仅仅是因为它看起来像一个 switch 语句。
Python 3.10 中的匹配大小写
Python 3.10 中新增了“Structural Pattern Matching”。它的语法功能强大且用途广泛。其中,它允许看起来像 switch 语句的简单示例:
"""
https://stackoverflow.com/questions/63755912/
why-does-pylint-complain-about-unnecessary-elif-after-return-no-else-return
"""
def match_case_example(value):
"""
Simple match-case example, for python 3.10+
see https://peps.python.org/pep-0622/
"""
match value:
case 1:
return 1
case 2:
return 2
case _other:
return 3
print(match_case_example(4))
# 3
Pylint 对此脚本没有什么可抱怨的,前提是您有 Python 3.10 或更高版本。
评论