为什么人会使用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 >>>
jfs.. 18
在不牺牲可读性的情况下,它可以减少两行代码.
对于嵌套或连续的代码块,它可能特别方便.相比:
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
说做某事,如果提出错误就不传播错误
它不那么重要,因为大多数人都不会注意到这种差异.
在不牺牲可读性的情况下,它可以减少两行代码.
对于嵌套或连续的代码块,它可能特别方便.相比:
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
说做某事,如果提出错误就不传播错误
它不那么重要,因为大多数人都不会注意到这种差异.