为什么使用 contextlib.suppress 而不是 try/except with pass? [英] Why use contextlib.suppress as opposed to try/except with pass?
问题描述
为什么要使用 contextlib.suppress
抑制异常,而不是 try
/except
和 pass
?
Why would one use contextlib.suppress
to suppress an exception, instead of try
/except
with a pass
?
这两种方法在字符数量上没有区别(如果有的话,suppress
有更多的字符),即使代码经常被计入 LOC 而不是字符,suppress
似乎也比 try
/except
在这两种情况下都慢得多,当出现错误时:
There is no difference in the amount of characters between these two methods (if anything, suppress
has more characters), and even though code is often counted in LOC instead of characters, suppress
also seems to be much slower than try
/except
in both cases, when an error is raised and when it's not:
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
>>>
推荐答案
在不牺牲可读性的情况下少了两行代码.
It is two lines less code without sacrificing readability.
对于嵌套或连续的代码块可能特别方便.比较:
It might be especially convenient for nested or consecutive code blocks. Compare:
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
说做某事,如果出现错误就不要传播
它不太重要,因为大多数人不会注意到差异.
It is less important because most people won't notice the difference.
这篇关于为什么使用 contextlib.suppress 而不是 try/except with pass?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!