[英]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.SHORT
或OP_FORM.LONG
) 不見了。 因此,例如,如果opcode_form
是某個字符串"string"
,則該函數實際上不會返回任何內容。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.