为什么使用contextlib.suppress而不是try / except with pass?

时间:2016-01-02 14:13:03

标签: python python-3.x

为什么会使用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
>>> 

2 个答案:

答案 0 :(得分:17)

在不牺牲可读性的情况下,代码减少了两行。

对于嵌套或连续的代码块可能特别方便。比较:

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

VS:

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

它还允许表达意图:

  • with suppress(SpecificError): do_something()如果在做某事时被引发则不会传播错误
  • try: do_something() except SpecificError: pass执行某些操作,如果错误被引发则不会传播错误

这不太重要,因为大多数人都不会注意到这种差异。

答案 1 :(得分:3)

从概念上讲,对我来说,contextlib.suppress方法允许我处理可能发生的错误(例如尝试删除实际上可能不存在的文件)。尝试/除了然后变得更积极地处理'这不应该发生'事件(例如除以0或无法打开我要写的几个)。