处理PyLint警告:不一致的返回语句

9

我正在对一些代码运行PyLint,但是我收到了警告:“一个函数中的所有返回语句都应该返回一个表达式或者没有一个都不应该返回。(inconsistent-return-statements)”

这是我拥有的代码:

def determine_operand_count(opcode_form, opcode_byte):
  if opcode_form == OP_FORM.VARIABLE:
    if opcode_byte & 0b00100000 = 0b00100000:
      return OP_COUNT.VAR

    return OP_COUNT.OP2

  if opcode_form == OP_FORM.SHORT:
    if opcode_byte & 0b00110000 == 0b00110000:
      return OP_COUNT.OP0

    return OP_COUNT.OP1

  if opcode_form == OP_FORM.LONG:
    return OP_COUNT.OP2

"OP_FORM"和"OP_COUNT"是之前代码中定义的枚举。

对我来说,这段代码非常易读,我很好奇PyLint警告在抱怨什么。在我的所有条件语句中,都返回了一个“OP_COUNT”类型。事实上,如果这些条件语句中没有任何一个返回“OP_COUNT”,我的代码将完全失败。

这似乎是关于我的“return语句”的警告,建议一些语句没有返回任何表达式。但这显然不是真的(就我所看到的),因为每个return语句都返回了某些东西。所以我猜测这与隐含的返回有关?

但是,就这一点而言,在我的原始代码中,我实际上为我的内部if语句保留了“else”子句。但是当我这样做时,PyLint给了我另一个警告:“不必要的'else' after 'return'(no-else-return)。”

我确实看到了以下内容:"如何修复python中不一致的返回语句?",但那似乎并不反映我代码中的情况。

因此,对我来说不清楚如何在这种情况下满足PyLint,因为代码显然可以正常工作,并似乎正在执行警告建议我应该做的事情。鉴于此,我怀疑我可能错过了一些明显的东西,但目前缺乏发现的直觉。如有帮助,请指出我所缺失的内容。

2个回答

9
Pylint抱怨函数结束时发生的情况。函数结束时应该发生什么?(加上return,警告就消失了)
def determine_operand_count(opcode_form, opcode_byte):
    if opcode_form == OP_FORM.VARIABLE:
        if opcode_byte & 0b00100000 == 0b00100000:
            return OP_COUNT.VAR
        return OP_COUNT.OP2

    if opcode_form == OP_FORM.SHORT:
        if opcode_byte & 0b00110000 == 0b00110000:
            return OP_COUNT.OP0
        return OP_COUNT.OP1

    if opcode_form == OP_FORM.LONG:
        return OP_COUNT.OP2

    return OP_COUNT.UNKNOWN

这个代码应该可以工作,但是由于缩进的原因,它在使用一段时间后可能会变得容易出错。另一种可行的替代方案是按照如下的方式编写:

def determine_operand_count_v2(opcode_form, opcode_byte):
    def variable_form(opcode_byte):
        if opcode_byte & 0b00100000 == 0b00100000:
            return OP_COUNT.VAR
        return OP_COUNT.OP2

    def short_form(opcode_byte):
        if opcode_byte & 0b00110000 == 0b00110000:
            return OP_COUNT.OP0
        return OP_COUNT.OP1

    def long_form(_):
        return OP_COUNT.OP2

    opfcn = {OP_FORM.VARIABLE: variable_form,
             OP_FORM.SHORT: short_form,
             OP_FORM.LONG: long_form}

    return opfcn[opcode_form](opcode_byte)

1
啊,我明白了。这很有道理。在这种情况下,我现在意识到我的思维错误了。如果没有 OP_FORM,这段特定的代码将永远不会被执行。因此,这个方法 应该 永远不会出现 OP_COUNT 未知的情况,因为只有当 opcode_form 未生成为我所拥有的其中之一时才可能发生。但是,如果找不到 opcode_form,这个方法将永远不会被调用。但是——那是意图;不一定是实现。而 PyLint 正确地指出了这一点。 - Jeff Nyman
而且,确实添加您的建议可以解决警告。 - Jeff Nyman
你可以在一个函数中嵌套另一个函数吗?这样做的好处是什么? - Lou

2

在您的情况下,可能有两个原因:

1)由于某种原因,您的变量名称大小写不一致:opcode_Form(第一个if语句中的大写“F”),而所有其他地方都是opcode_form(小写“f”)。这很可能只是您打错了,因为在同一位置上还有=而不是==

2)更有可能的是,由于opcode_form没有被类型提示为OP_FORM枚举实例,它实际上可以是任何值,并且缺少最终的else(当opcode_form既不是OP_FORM.VARIABLE也不是OP_FORM.SHORTOP_FORM.LONG时)。因此,例如,如果opcode_form是一些字符串"string",则函数实际上将返回空值。


谢谢。大写字母"F"是我打字时的错误。在代码中并不是这样的。我已经更新了原始代码以显示这一点,但感谢您指出这一点,因为它显示了抄写代码而不是仅仅复制它的危险。 - Jeff Nyman
关于类型提示,这很有趣。我尝试将此添加到函数头中:def determine_operand_count(opcode_form: OP_FORM, opcode_byte: int)(如果我正确理解您的类型提示)。但仍然返回相同的PyLint警告。 - Jeff Nyman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接