Как заставить python «исключать» каждую строку кода в чанке, а не в целом? - PullRequest
0 голосов
/ 31 мая 2018

Я работал над некоторым кодом на python, и возился со списками, чтобы создать матрицу, и работал над способом заполнения элементов и тех, которые окружают эти элементы значениями.Я столкнулся с «индексом вне диапазона ошибок», как будто я перебираю каждый элемент и достигаю дальнюю сторону матрицы и пытаюсь добавить дальше, он выпадает из списка.Несмотря на то, что это плохая практика, я решил использовать метод "try ... Кроме ... Pass", чтобы мой код выглядел следующим образом: https://i.stack.imgur.com/fMYCF.png

Однако проблема заключается в том, что после прохождения одной ошибкивозвращается прямо в начало цикла и не может добавить оставшиеся значения к окружающим элементам.Есть ли способ заставить команду «try» применяться отдельно к каждой команде или она должна быть индивидуально для каждой строки?

1 Ответ

0 голосов
/ 31 мая 2018

В таких случаях обычно требуется функция-оболочка.

Например, у вас есть несколько строк, которые выглядят так:

self.w[i0-1][j0+1] += 3

Единственное отличие от одной строки к следующей - это два индекса и значение приращения.Итак, давайте напишем метод, который принимает эти три вещи в качестве параметров:

def _inc(self, i, j, diff):
    try:
        self.w[i][j] += diff
    except:
        pass

И теперь каждую из этих строк можно изменить на:

self._inc(i0-1, j0+1, 3)

… и это будетто, что вы хотели: увеличивать все, что не вызывает исключения, ничего не делать, когда оно делает.

Но, пока мы работаем над этим, вам, вероятно, здесь не нужен голый except.Вместо этого вы хотите защититься только от конкретного исключения, которое вы ожидали.Это, вероятно, IndexError.

. Хорошая особенность функции-обертки в том, что нам нужно всего лишь изменить вещи в одном месте вместо 78 мест:

def _inc(self, i, j, diff):
    try:
        self.w[i][j] += diff
    except IndexError:
        pass

И аналогично, еслиВы хотели изменить вещи так, чтобы они вызывали log.debug каждый раз, когда возникает исключение, вы просто заменяете это pass.

Или, если вы хотите предварительно или пост-проверить это 0 <= i < len(self.w) and 0 <= j < len(self.w[i]).(И вы можете захотеть этого - обратите внимание, что если self.w является списком списков, когда i0 равно 0, i0-1 равно -1, что не повысит IndexError, оно будет увеличиватьсяпоследний ряд…)

...