Обработка PyLint Предупреждение о непоследовательном операторе возврата - PullRequest
2 голосов
/ 16 января 2020

Я запускаю PyLint для некоторого кода и получаю предупреждение «Либо все операторы return в функции должны возвращать выражение, либо ни один из них не должен. (Inconsistent-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, мой код полностью потерпел бы неудачу.

Это, кажется, предупреждение о моих "операторах возврата", предполагая, что некоторые не возвращают никакого вида выражения. Но это явно не так (насколько я вижу), поскольку каждое возвращаемое выражение что-то возвращает. Так что я предполагаю, что это связано с подразумеваемым возвратом?

Но до этого момента в моем исходном коде я фактически содержал предложения "else" для своих внутренних операторов if. Но когда я это сделал, PyLint дал мне еще одно предупреждение: «Ненужное« else »после« return »(no-else-return)».

Я увидел следующее: « Как исправить несоответствие оператор return в python?", но это, похоже, не отражает ситуацию в моем коде.

Так что мне неясно, как удовлетворить PyLint в этом случае, так как код четко работает и кажется, делает то, что подсказывает мне предупреждение. Учитывая это, я подозреваю, что упускаю что-то очевидное, но в настоящее время мне не хватает интуиции для определения. Буду признателен за любую помощь в обнаружении того, что мне не хватает.

Ответы [ 2 ]

3 голосов
/ 16 января 2020

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

Этот код должен работать, но, по моему опыту, с течением времени он выглядит как fr agile из-за отступа. Альтернативой является запись в виде:

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)
2 голосов
/ 16 января 2020

В вашем случае это может произойти по двум причинам:

1) Случай имени вашей переменной по какой-то причине не согласуется: opcode_Form (с заглавной буквой "F") в первом операторе if (вероятно, вы просто набрали его неправильно, так как у вас также есть = вместо == в том же месте) и opcode_form (со строчной буквой "f") во всех других местах.

2) Подробнее скорее всего, поскольку opcode_form не намекается на тип как экземпляр перечисления OP_FORM, на самом деле он может иметь любое значение, и окончательный else (для случая, когда opcode_form не является ни OP_FORM.VARIABLE, ни OP_FORM.SHORT или OP_FORM.LONG) отсутствует. Так, например, если opcode_form является некоторой строкой "string", функция фактически ничего не возвратит.

...