Как обработать исключения в списке понимания?

У меня есть некоторые понимание списка в Python, в котором каждое повторение может выдать исключение.

Например, если я имею:

eggs = (1,3,0,3,2)

[1/egg for egg in eggs]

Я получу a ZeroDivisionError исключение в 3-м элементе.

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

Единственным путем я могу думать, должен использовать функцию помощника:

def spam(egg):
    try:
        return 1/egg
    except ZeroDivisionError:
        # handle division by zero error
        # leave empty for now
        pass

Но это выглядит немного громоздким мне.

Существует ли лучший способ сделать это в Python?

Примечание: Это - простой пример (см., "например", выше), что я изобрел, потому что мой реальный пример требует некоторого контекста. Я не интересуюсь предотвращением, делятся на нулевые ошибки, но в обрабатывании исключений в понимании списка.

97
задан martineau 27 June 2019 в 23:35
поделиться

4 ответа

В Python нет встроенного выражения, позволяющего игнорировать исключение (или возвращать альтернативные значения & c в случае исключений), поэтому невозможно, буквально говоря, «обрабатывать исключения в понимание списка ", потому что понимание списка - это выражение, содержащее другое выражение, не более того (т. е. нет операторов, и только операторы могут перехватывать / игнорировать / обрабатывать исключения).

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

Правильные ответы на вопрос "как обрабатывать исключения в понимании списка "все выражают часть всей этой истины: 1) буквально, т.е. лексически В самом понимании вы не можете; 2) практически вы делегируете задание функции или проверяете наличие ошибок склонны к ценностям, когда это возможно. Таким образом, ваше неоднократное утверждение, что это не ответ, является необоснованным.

81
ответ дан 24 November 2019 в 05:25
поделиться

Я не видел, что любой ответ упомянул это. Но этим примером был бы один способ препятствовать тому, чтобы исключение было повышено для известных провальных случаев.

eggs = (1,3,0,3,2)
[1/egg if egg > 0 else None for egg in eggs]


Output: [1, 0, None, 0, 0]
0
ответ дан 24 November 2019 в 05:25
поделиться

Вы можете использовать

[1/egg for egg in eggs if egg != 0]

, это просто пропустит нулевые элементы.

19
ответ дан 24 November 2019 в 05:25
поделиться

Нет лучшего способа. Во многих случаях вы можете использовать избегание, как это делает Питер

Другой вариант - не использовать понимание

eggs = (1,3,0,3,2)

result=[]
for egg in eggs:
    try:
        result.append(egg/0)
    except ZeroDivisionError:
        # handle division by zero error
        # leave empty for now
        pass

Вам решать, будет ли это более громоздким или нет

8
ответ дан 24 November 2019 в 05:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: