当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《为什么使用contextlib.suppress而不是try/exceptwithpass?》经验,为你挑选了1个好方法。

为什么人会使用contextlib.suppress来抑制异常,而不是try/ exceptpass

这两种方法之间的字符数没有区别(如果有的话,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做某事,如果提出错误就不传播错误

它不那么重要,因为大多数人都不会注意到这种差异.



1> jfs..:

在不牺牲可读性的情况下,它可以减少两行代码.

对于嵌套或连续的代码块,它可能特别方便.相比:

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做某事,如果提出错误就不传播错误

它不那么重要,因为大多数人都不会注意到这种差异.

推荐阅读
php
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有