当前位置: 首页 > 知识库问答 >
问题:

处理不一致的退货声明的PyLint警告

冀崇凛
2023-03-14

我在一些代码上运行PyLint,并收到警告:“要么函数中的所有返回语句都应该返回表达式,要么它们都不应该返回表达式。(返回语句不一致)。”

以下是我的代码:

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”是代码前面定义的枚举。

对我来说,这段代码非常可读,我想我很好奇派林的警告在抱怨什么。在我拥有的每个条件中,都会返回一个“OP\u COUNT”类型。事实上,如果这些条件中的任何一个没有返回OP\u计数,我的代码将完全失败。

这似乎是对我的“return语句”的警告,表明有些语句没有返回任何类型的表达式。但这显然不是真的(据我所知),因为每个return语句都返回了一些东西。所以我猜这与隐含回报有关?

但在这一点上,在我的原始代码中,我实际上为我的内部if语句保留了“fe”子句。但当我这样做时,PyLint给了我另一个警告:“不必要的‘其他’在‘返回’之后(no-else-back)。”

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

因此,我不清楚在这种情况下如何满足PyLint,因为代码显然有效,并且似乎正在执行警告建议我需要执行的操作。有鉴于此,我怀疑我遗漏了一些显而易见的东西,但我目前缺乏发现的直觉。如果有人能帮我发现我缺少的东西,我将不胜感激。

共有2个答案

简学文
2023-03-14

在您的情况下,发生这种情况可能有两个原因:

1)由于某种原因,您的变量名大小写不一致:opcode_Form(大写为F)在第一个if语句中(可能您只是输入错误,因为您也有=而不是==在同一位置)和opcode_form(小写为f)在所有其他地方。

2) 更有可能的是,由于操作码表单不是类型暗示为操作码表单枚举实例,它实际上可以是任何值,并且最终的else(对于操作码表单既不是操作码表单。变量也不是操作码表单。SHORT(短)或LONG(长)缺失。因此,例如,如果opcode\u form是某个字符串,那么函数实际上不会返回任何内容。

蒙化
2023-03-14

Pylint抱怨当您到达函数的最末端时发生了什么。函数结束时应该发生什么?(添加了一个返回,警告消失了)

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)
 类似资料:
  • 问题内容: 我是Java新手。我正在做一个小型程序实践,并且会丢失return语句错误。 有人可以帮忙吗? 问题答案: 问题出在语句上。您缺少分支。当表达式的计算值为时,您的程序将不返回任何内容,因此将返回错误。 将其更改为如下所示:

  • Section Contents 基本内容 具体细节

  • 我得到这个错误- (节点:18420)未处理的PromisejectionWarning:TypeError:无法读取未定义的属性“name” (节点:18420)未处理的PromisejectionWarning:未处理的promise拒绝。此错误源于在没有catch块的情况下抛出异步函数的内部,或者拒绝使用未处理的promise。catch()。要在未处理的promise拒绝时终止节点进程,请

  • ANTLR4书引用了一个多模式示例 https://github.com/stfairy/learn-antlr4/blob/master/tpantlr2-code/lexmagic/ModeTagsLexer.g4 https://github.com/stfairy/learn-antlr4/blob/master/tpantlr2-code/lexmagic/ModeTagsParser.

  • 按照下面的介绍youtube.com/playlist?list=plea0wjq13cnafcc0azrcyqucn_tpeljn1创建本体。它稍微缩小了http://prntscr.com/bo4l3w,我自己添加了canBeTutor(意思是某人可以成为某人的导师)对象属性。据我理解,我可以添加SWRL规则,然后启动reasoner来创建新的知识。所以我添加了prntscr.com/bo4l

  • 我一直在网上关注关于SQLite的android教程。我有一份声明,我不确定: 在这个方法中,意味着什么?它是当前对象还是上下文?谢谢