Рубрики
Без рубрики

Подавление исключений в Python с ContextLib.Suppress, а не пытаться/кроме/пройти

При программировании обычно выполнять операцию, которая, как ожидается, будет терпеть неудачу, но должна … помечать Python.

При программировании обычно выполнять операцию, которая, как ожидается, будет терпеть неудачу, но не должна бросать ошибку. В Python, Попробуйте/кроме Положения часты. С точки зрения человека, Попробуйте/кроме означает, «попробуйте эту операцию, и если она не удастся для «Например, вы можете попробовать следующее в своей консоли.

friends = {"Nguyen": "tacos", "Hannah": "borscht"}


def get_food(friend_name):
    try:
        food = friends[friend_name]
    except KeyError:
        food = "baklava"
        friends[friend_name] = food
    return food


get_food("Nguyen")
# "tacos"

get_food("Ahmed")
# "baklava"

friends
# {'Nguyen': 'tacos', 'Hannah': 'borscht', 'Ahmed': 'baklava'}

Выше на простом языке: Если ключ не в словаре, не волнуйтесь, просто добавьте его с значением по умолчанию.

Что если у вас нет альтернативного курса действий? Что если вы просто хотите заставить замолчать ошибку? Допустим, вы хотите сделать каталог, и если каталог уже есть, не ныть об этом, просто игнорируйте. Некоторые разработчики используют Попробуйте/наконец Также для этого случая:

import os

os.mkdir("frivolous_directory")

try:
    os.mkdir("frivolous_directory")
except FileExistsError:
    pass

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

Однако, с точки зрения человека, вышеупомянутое Попробуйте/кроме Блок читает так: сделайте каталог, но если это не удается, потому что он уже существует, тогда выполните следующее действие: мм, ничего.

Итак, из утилита Точка зрения, все работает нормально. Из Семантический Точка зрения, это не особенно значимо.

Значимая альтернатива: Contextlib.suppress

Если желание состоит в том, чтобы просто подавить ошибку, а не выполнять какую -то логику ветвления, в стандартной библиотеке Python есть парадигма для этого: contextlib.suppress () Анкет Это работает так:

import contextlib
import os

os.mkdir("frivolous_directory")

with contextlib.suppress(FileExistsError):
    os.mkdir("frivolous_directory")

FileExisterror В вышесказанном был замолчан.

Это было на две строки кода, чем предыдущий Попробуйте/кроме Пример (ОК, мы должны были добавить Импорт контексталиб , поэтому в этом примере меньше строки).

Что еще более важно, совершенно ясно, что происходит в коде. Мы не против, если операция не удастся по конкретной причине. Нет Пасс с неясным намерением. Мы не попробуйте что -то и не стремимся перехватить ошибку для дальнейшей логики или обработки.

Вывод

Это не так много о Работа Код, как и о читабельно и разумный код. Используя Contextlib.suppress это достойная практика. Читая немного о сокровищах в контекст Может стоить вашего времени!

Оригинал: “https://dev.to/bowmanjd/suppressing-exceptions-in-python-with-contextlib-suppress-not-try-except-pass-141c”