簡體   English   中英

處理返回語句不一致的 PyLint 警告

[英]Handling PyLint Warning of Inconsistent Return Statement

我在一些代碼上運行 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

這里的“OP_FORM”和“OP_COUNT”是前面代碼中定義的枚舉。

對我來說,該代碼是非常易讀的代碼,我想我很好奇 PyLint 的警告在抱怨什么。 在我擁有的每個條件下,都會返回一個“OP_COUNT”類型。 事實上,如果這些條件中的任何一個沒有返回 OP_COUNT,我的代碼就會完全失敗。

這似乎是對我的“返回語句”的警告,表明有些沒有返回任何類型的表達式。 但這顯然不是真的(就我所見),因為每個 return 語句都在返回一些東西。 所以我猜這與隱含回報有關?

但到那時,在我的原始代碼中,我實際上為我的內部if語句保留了“else”子句。 但是當我這樣做時,PyLint 又給了我一個警告:“在‘return’之后出現不必要的‘else’(no-else-return)。”

我確實看到了以下內容:“ 如何在 python 中修復不一致的返回語句? ”,但這似乎沒有反映我的代碼中的情況。

所以我不清楚在這種情況下如何滿足 PyLint,因為代碼顯然有效並且似乎正在做警告表明我需要做的事情。 鑒於此,我懷疑我遺漏了一些明顯的東西,但我目前缺乏發現的直覺。 任何幫助我發現我遺漏的東西都將不勝感激。

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)

在您的情況下,這可能有兩個原因:

1)由於某種原因,您的變量名稱大小寫不一致:第一個if語句中的opcode_Form (帶有大寫“F”)(可能您只是打錯了它,因為您在同一個地方也有=而不是== )和opcode_form (在所有其他地方使用小寫的“f”)。

2) 更有可能的是,因為opcode_form沒有作為OP_FORM枚舉實例的類型提示,它實際上可以是任何值,最后的else (對於opcode_form既不是OP_FORM.VARIABLE也不是OP_FORM.SHORTOP_FORM.LONG ) 不見了。 因此,例如,如果opcode_form是某個字符串"string" ,則該函數實際上不會返回任何內容。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM