为什么使用 contextlib.suppress 而不是 try/except with pass? [英] Why use contextlib.suppress as opposed to try/except with pass?

查看:36
本文介绍了为什么使用 contextlib.suppress 而不是 try/except with pass?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

为什么要使用 contextlib.suppress抑制异常,而不是 try/exceptpass?

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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆