Подтвердить что ты не робот

Зачем использовать contextlib.suppress в отличие от try/except с pass?

Зачем использовать contextlib.suppress для исключения исключения вместо try/except с помощью pass?

Нет никакой разницы в количестве символов между этими двумя методами (если что-либо, suppress имеет больше символов), и хотя код часто подсчитывается в LOC вместо символов, suppress также кажется намного медленнее чем try/except в обоих случаях, когда возникает ошибка, а когда нет:

Python 3.5.0 (v3.5.0:374f501f4567, Sep 13 2015, 02:27:37) [MSC v.1900 64 bit (AMD64)] on win32
Type "copyright", "credits" or "license()" for more information.
>>> from timeit import timeit
>>> # With an error
>>> timeit("""with suppress(ValueError):
    x = int('a')""", setup="from contextlib import suppress")
1.9571568971892543
>>> timeit("""try:
    x = int('a')
except ValueError:
    pass""")
1.0758466499161656
>>> # With no error
>>> timeit("""with suppress(ValueError):
    x = int(3)""", setup="from contextlib import suppress")
0.7513525708063895
>>> timeit("""try:
    x = int(3)
except ValueError:
    pass""")
0.10141028937128027
>>> 
4b9b3361

Ответ 1

Это на две строки меньше кода, не жертвуя удобочитаемостью.

Это может быть особенно удобно для вложенных или последовательных кодовых блоков. Для сравнения:

try:
    a()
    try:
        b()
    except B:
        pass
except A:
    pass

против:.

with suppress(A):
    a()
    with suppress(B):
        b()

Это также позволяет выразить намерение:

  • with suppress(SpecificError): do_something() говорит, что не распространяйте ошибку, если она возникает при выполнении чего-то
  • try: do_something() except SpecificError: pass говорит что-то делать и не распространяет ошибку, если она поднята

Это менее важно, потому что большинство людей не заметят разницы.

Ответ 2

Концептуально для меня подход contextlib.suppress позволяет мне обрабатывать ошибки, которые могут возникнуть (например, попытка удалить файл, который на самом деле не существует). try/except вместо этого становится более активной обработкой событий "это не должно происходить" (например, деление на 0 или невозможность открыть некоторые из них, которые я хочу написать).