Пингвитон
Полагаю, все однажды видели или использовали вот эту конструкцию:
try:
<какой-то код>
except <какой-то тип эксепшена>:
pass
Это обычный способ реализации логики вида "нужно поймать эксепшен конкретного типа, проигнорировать его и продолжить работу". В стандартной библиотеке есть более лаконичный способ:
from contextlib import suppress
with suppress(<какой-то тип эксепшена>):
<какой-то код>
Это контекстный менеджер suppress, который импортируется из модуля contextlib. Ему передаётся тип эксепшена (или типы, можно несколько, да), который необходимо "проглотить", дальше в теле with пишем код, который эти эксепшены может выкинуть. Если эксепшен возникнет, он будет пойман и проигнорирован, а управление перейдёт к первой строчке после блока with.
Документация стандартной библиотеки напоминает, что "как и с любым другим механизмом, полностью подавляющим эксепшены, этот контекстный менеджер следует использоваться только в конкретных специфических случаях, когда молчаливое продолжение работы программы после возникновения эксепшена точно является правильным поведением".
В общем, не глотайте эксепшены без повода, процесс дебага может стать очень болезненным (:
Хороший пример, когда этот контекстный менеджер удобно использовать, -- удаление файла. Я хочу почистить старые файлы перед запуском программы, но может быть так, что это первый запуск и старых файлов ещё не накопилось. Делаю так:
with suppress(FileNotFoundError):
os.remove('my-file.txt')
Этот контекстный менеджер доступен, начиная с Python 3.4.
Если вы используете более старые версии Питона, то вы можете добавить в проект собственную реализацию, которая будет выглядеть так:
from contextlib import contextmanager
@contextmanager
def suppress(*exceptions):
try:
yield
except exceptions:
pass
3 · 400 ·