Игнорировать исключение в Python

У меня есть блок try-except в python, и я не хочу ничего делать при возникновении исключения. Мой код выглядит следующим образом:

for i in range(len(grid)):
    for j in range(len(grid[i])):
        try:
            count = count > int(grid[i][j]) ? count : int(grid[i][j])
        except:
            //Do nothing here

Как мне ничего не делать при обнаружении исключения.

Спасибо.


person hrishikeshp19    schedule 11.02.2012    source источник
comment
Пожалуйста, не используйте try: .. except: pass - по крайней мере укажите тип исключения, которое вы хотите игнорировать! В противном случае вы, вероятно, столкнетесь с трудными для отладки проблемами в какой-то момент, когда не заметите возникшего исключения.   -  person ThiefMaster    schedule 12.02.2012
comment
Если вы собираетесь это сделать, я настоятельно рекомендую указать, какое исключение вы хотите игнорировать (например, IndexError). Это очень плохая практика - молча проглатывать все исключения.   -  person André Caron    schedule 12.02.2012
comment
Допустима ли сейчас конструкция a ? b : c на Python ?! Я, должно быть, пропустил это ...   -  person Mark Byers    schedule 12.02.2012
comment
@ThiefMaster: Как указать тип исключения?   -  person hrishikeshp19    schedule 12.02.2012
comment
Чтобы указать тип исключения, просто создайте подкласс суперкласса Exception и убедитесь, что у вас есть полезный метод __str__.   -  person snim2    schedule 12.02.2012
comment
@ hrishikeshp19 Хорошо, я оставил вам простой пример здесь: gist.github.com/1804191   -  person snim2    schedule 12.02.2012
comment
@MarkByers: Вы правы. а? b: c не работает ... Я изменил это на if..else   -  person hrishikeshp19    schedule 12.02.2012


Ответы (5)


pass - это ключевое слово, которое вы ищете.

person snim2    schedule 11.02.2012
comment
теоретически вы можете добавить туда любое выражение (например, 0), но pass просто более питонический. - person Niklas R; 12.02.2012
comment
@NiklasR Я не уверен. 0 является выражением и оценивается как 0, pass - это утверждение. Так что не совсем то же самое. - person snim2; 12.02.2012
comment
Но переводчик не стал жаловаться. "" тоже можно было и т. Д. - person Niklas R; 12.02.2012
comment
Опять же, "" - это выражение. Интерпретатор может не жаловаться как таковой, но если вы не собираетесь ничего делать с полученным значением, я бы посоветовал оценивать его без надобности плохой практикой, хотя бы по той причине, что это сбивает с толку любого, кто читает ваш код. - person snim2; 12.02.2012

Давайте правильно напишем код.

  • Мы хотим перебрать каждую ячейку сетки. Так что сделайте это. Не создавайте списки чисел (range), которые вы перебираете, а затем используете для обратного индексации. Циклы for в Python работают непосредственно с контейнером. Это удобно, понятно и хорошо. Не борись с этим.

  • В Python нет конструкции ?:. Есть конструкция x if y else z, но здесь она не подходит. Вы явно пытаетесь установить count на максимум текущего значения и значения ячейки. Для этого есть встроенная функция.

  • Вам действительно нужен максимум всех этих ячеек. Так что попросите об этом напрямую; не думайте, что вам нужно реализовать алгоритм высшей точки самостоятельно. Вы этого не сделаете. (Это также защищает вас от необходимости выбирать начальное значение для count, что может быть неправильным.) Нам не нужно выполнять итерацию с явным циклом для этого. Мы можем указать список значений для передачи max с помощью выражения генератора.

  • Вы хотите «игнорировать» значения, которые нельзя преобразовать в целые числа. Несмотря на то, что, вероятно, что-то не так с вашим другим кодом, если существование таких значений могло возникнуть в первую очередь: мы можем просто провести тест и отфильтровать значения, которые не прошли тест.

Таким образом:

def is_integral(value):
    try:
        int(value)
        return True
    except:
        return False


# Now, get the maximum of all the integral values:
count = max(
    int(cell) for row in grid for cell in row
    if is_integral(cell)
)
person Karl Knechtel    schedule 11.02.2012
comment
Это слишком высокий уровень для меня сейчас. Это мой первый день. Спасибо за предложение. - person hrishikeshp19; 12.02.2012
comment
В этом нет ничего концептуально сложного (кстати, высокий уровень программирования обычно означает противоположное тому, что вы думаете, хотя это вполне понятно). Написание кода таким способом проще, чем то, как вам показывают, как его писать. Для этого требуется меньше абстракции, потому что вы не занимаетесь такими вещами, как попытки выяснить, какое отношение этот range объект имеет к вашему исходному списку. Люди, которые пытаются преподавать программирование, часто имеют очень странные представления о том, что легко, а что сложно. Они учат всему не по порядку. :( - person Karl Knechtel; 12.02.2012
comment
+1 за решение реальных проблем. - person bgporter; 12.02.2012
comment
+1 это дает ряд хороших моментов. - person Gareth Latty; 12.02.2012
comment
+1 самый приятный и имхо самый полезный ответ для ОП. - person Niklas R; 12.02.2012
comment
@KarlKnechtel: Я бы поместил return True в предложение else оператора try..except. Хотя в этом случае это не имеет значения, он научит новичка правильному пути (поместите только код, который может вызвать исключение в try, обработку исключений в except, если-все-пошло-хорошо в else) - person ThiefMaster; 12.02.2012
comment
@KarlKnechtel: Я знаю, что означает высокий уровень в контексте языков программирования. В предыдущем комментарии на высоком уровне я имел в виду сложность x для i в a для j в b для новичка. Ваш ответ отличный. Теперь, после многократного использования цикла for, ваш подход кажется намного чище, безопаснее и удобнее. Спасибо. :) - person hrishikeshp19; 12.02.2012

Вы можете использовать pass, но также _ 2_ является синонимом в Python 3.x, что может быть удобно для написания псевдокода.

Я вижу, что многие люди используют pass там, где им действительно не нужно ничего делать, в то время как ... используют его в качестве заполнителя.

class SomeInterface:
    def do_something(self):
        pass

class SomeImplementation(SomeInterface):
    def do_something(self)
        ...

Это упрощает поиск ... и области, где у вас есть нереализованный код, без ложных срабатываний от pass.

Обратите внимание, что передача исключения, как правило, является плохой практикой, так как вы практически всегда захотите действовать с исключениями. Вы должны обязательно, по крайней мере, указать точное исключение (я), которое вы хотите перехватить, иначе вы поймаете все исключения, потенциально вызывая ошибки, которые вы не можете обнаружить, если другое исключение поднимает его голову.

person Gareth Latty    schedule 11.02.2012
comment
... не является строго синонимом, но не окажет никакого влияния. Это простое выражение, вроде добавления туда None, 0 или "foo". ... оценивается как Ellipsis синглтон. - person Thomas K; 12.02.2012
comment
@ThomasK Правда, синоним был неудачным выбором или словами с моей стороны. В этом случае он будет работать так же, как и pass. - person Gareth Latty; 12.02.2012

result = x if a > b else y

Тернарный оператор

Заявление о бездействии

pass
person Nickle    schedule 11.02.2012

person    schedule
comment
Это всегда ничего не даст, потому что в операторе есть SyntaxError, и вы перехватываете все исключения. - person kindall; 12.02.2012
comment
@kindall: Я не думаю, что таким образом можно поймать SyntaxError; он должен подниматься при объявлении, а не во время выполнения. - person DSM; 12.02.2012