为什么 pylint 在“return”(no-else-return)之后抱怨不必要的“elif”?

why does pylint complain about Unnecessary "elif" after "return" (no-else-return)?

提问人:zyxue 提问时间:9/6/2020 最后编辑:Rahul Kumarzyxue 更新时间:9/8/2023 访问量:12329

问:

为什么 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 或更高版本。