如何修复python中不一致的return语句?

Posted

技术标签:

【中文标题】如何修复python中不一致的return语句?【英文标题】:How to fix inconsistent return statement in python? 【发布时间】:2019-07-14 01:22:42 【问题描述】:

我是 python 新手,我有这个项目我正在做一个小项目,它有两个函数,第一个函数返回第一次在字符串中发现差异的索引。下一个函数执行此操作,但在字符串列表中。现在,由于我是业余爱好者,我使用了过多的 if 和 else 语句,导致返回语句过多,尤其是在第二个函数中,我得到了错误 [R1710:consistent-return-statements]。我该如何解决它,任何人都可以给我清晰的例子来更好的代码吗?抱歉问题拖了这么久。

IDENTICAL = -1
def singleline_diff(line1, line2):
    """
    Inputs:
        line1 - first single line string
        line2 - second single line string
    Output:
        Returns the index where the first difference between
        line1 and line2 occurs.

        Returns IDENTICAL if the two lines are the same.
    """
    len1 = len(line1)
    len2 = len(line2)
    minimum_length = min(len1, len2)

    if len1 != len2:
        if minimum_length == 0:
            return 0
        for idx in range(minimum_length):
            if line1[idx] == line2[idx]:
                pass
            else:
                return idx
        return idx + 1

    for idx in range(len1):
        if line1[idx] == line2[idx]:
            pass
        else:
            return idx
    return IDENTICAL

def multiline_diff(lines1, lines2):
    """
    Inputs:
      lines1 - list of single line strings
      lines2 - list of single line strings
    Output:
      Returns a tuple containing the line number (starting from 0) and
      the index in that line where the first difference between lines1
      and lines2 occurs.

      Returns (IDENTICAL, IDENTICAL) if the two lists are the same.
    """
    line_no = singleline_diff(lines1, lines2)

    len_lines1, len_lines2 = len(lines1), len(lines2)

    if len_lines1 == len_lines2:

        if (len_lines1 or len_lines2) == 0:
            if len_lines1 == len_lines2:
                return (IDENTICAL, IDENTICAL)
            else:
                idx = singleline_diff(lines1[line_no], lines2[line_no])
                return (line_no, idx)

        else:
            idx = singleline_diff(lines1[line_no], lines2[line_no])

            if line_no == IDENTICAL:
                return (IDENTICAL, IDENTICAL)
            elif line_no != IDENTICAL:
                return (line_no, idx)

    else:
        return (line_no, 0)

【问题讨论】:

你能提供一些你的代码失败的例子吗? line_no = singleline_diff(lines1, lines2)。而且这个函数不需要两个字符串而不是字符串列表吗? 它没有失败,它工作得很好,但它不是干净的,函数 multiline_diff pylint 返回 [R1710:不一致返回语句] 是的,但它需要字符串列表并返回存在差异的列表项的索引 【参考方案1】:

看这里的代码:

if len_lines1 == len_lines2:
    return (IDENTICAL, IDENTICAL)
else:
    idx = singleline_diff(lines1[line_no], lines2[line_no])
    return (line_no, idx)

你可以把上面的东西写成这样:

if len_lines1 == len_lines2:
    return (IDENTICAL, IDENTICAL)
idx = singleline_diff(lines1[line_no], lines2[line_no])
return (line_no, idx)

你只是不需要一个 else 块来返回这个表达式,因为如果控件没有进入 if 块,这部分代码将自动被调用。希望对您有所帮助。

【讨论】:

这确实是一种更好的格式,但不幸的是仍然会弹出相同的错误:( 删除最后一个 else 块。你也不需要那个。 就是这样,这就是问题所在,非常感谢@Abhishek Arya,非常感谢您的时间。 @MohamedMotaz,看看here。【参考方案2】:

OP 代码中的语义错误在哪里是 Abhishek Arya's answer

TL;DR - 提前返回:

def your_function():
    if not should_do():
        return # NO RETURN VALUE!
    # rest of the function

...是的,这将不再发出 inconsistent-return-statements ;)

当您搜索 inconsistent-return-statements 时也会弹出此 Q/A,我想为这些人提供一个简短的“常见问题”指南。

案例A:返回值无关紧要,只想早点退出函数

在某些情况下,有些函数(或“程序”,如果您想获得技术知识)只是做某事,但根本不希望有任何返回值, 同时,可能有例如在函数开始时进行某种检查是否该函数运行是否有意义,您可能首先想到的是将整个函数代码包装在 if 语句中:

def your_function(article):
    if display_content():
        content = get_content(article)
        # do some extensive logic to generate final content
        # ...
        print(content)

...这太简单了,但我们希望你能想象一下,如果有更多的检查和更多的代码,这样的编码会很快变成“意大利面条代码”+它还窃取了一个“标签”您迫切需要适应项目的最大行长度的空间。

幸运的是,许多其他编程语言一样,returning at ANY 有一种方法可以提前结束函数strong> 放在函数 run 中,意思是任何“Control Flow"” - 包括 if/elif/else、for/while loops、...

现在您可能会快速跳转到 return NoneFalse 等。虽然它会起作用,但您仍然会收到 pylint inconsistent-return-statements 警告 - 了解为什么让我们查看警告消息:

函数中的所有 return 语句都应该返回一个 表达式,或者它们都不应该。 pylint(不一致的返回语句)

从 pylint 的角度来看,如果您在 return 之后放置任何内容,它将被视为 表达式。那么该怎么办?实际上,在 Python 中,您可以返回“nothing”(这也不是 Python 独有的)

def your_function(article):
    if display_content():
        return

    content = get_content(article)
    # do some extensive logic to generate final content
    # ...
    print(content)

虽然在 Python 中返回“nothing”应该(并且在技术上,据我所知,它是)等同于 return None,但通过物理书写“None”,您表达意图不管它的隐含性。 不要将此与 pylint(assignment-from-none) (Assigning result of a function call, where the function returns None) 混淆 - 其中 both "return" 和 "return None" 被视为返回 None

案例 B:你的函数有一个不返回的案例

很常见的错误,尤其是在较大的代码中,是创建一个导致根本不返回任何内容的代码部分。这不是 完全 OP 的情况,因为他们只使用了相同条件的否定,但 pylint 不知道,所以这是它的思考过程:

if SOME_CONDITION: # ok, here's just another condition
    return someReturnExpression # and ok, it returns SOMETHING, let's note that
elif OPPOSITE_OF_SOME_CONDITION: # ok, here's just another condition
    return someReturnExpression # and ok, it returns SOMETHING, let's note that
# WAIT ! What?! THERE WAS NO "else:"! Hmmm...
# ...what happens if both conditions fail? NOTHING WOULD BE RETURNED!
# We need to make a warning about that!
# (fact that sometimes they return SOMETHING and sometimes NOTHING)

所以这个inconsistent-return-statements 可以解决

if SOME_CONDITION: # ok, here's some condition
    return someReturnExpression # and ok, it returns SOMETHING, let's note that
else: # ok, here's else
    return someReturnExpression # and ok, it returns SOMETHING, let's note that
# Ok, so if returns SOMETHING, else returns SOMETHING,
# so SOMETHING is returned every time! that's good!

...这本身有效,但它会产生另一个 pylint 问题

“return”之后不必要的“else” pylint(no-else-return)

请参阅 python 实际上鼓励早期返回,因为它通常会导致代码更清晰。 return 在函数运行期间 ENDS(/exits) 函数 并且 pylint 看到了 - 它看到如果条件为真,函数代码将简单地在那里结束 - 那又怎样,@ 987654323@,我和许多其他人建议只是在 if 部分之后继续代码:

if SOME_CONDITION:
    return someReturnExpression

# ... some more code ...
# ... some more code ...
return someReturnExpression

案例 C:组合

只是不要将“只是”returnreturn SOMETHING 结合起来, 如果您确实需要返回 None,只需在这种情况下明确地 return None

def get_article(id):
    article = find_article(id)
    if article.id == 0:
        return None

    return article

这只是一个例子,这不是你真正检查某些文章的方式;)

【讨论】:

以上是关于如何修复python中不一致的return语句?的主要内容,如果未能解决你的问题,请参考以下文章

Python:为啥模块中不允许“return”

加速器在 Python Tkinter 中不起作用:如何修复 [重复]

python中不一致的小数指数

void函数中不写return语句会占用栈内存吗?

如何修复 #1932 - 引擎中不存在表

如何修复 Angular Firestore 中不支持的字段值错误?