Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
477 views
in Technique[技术] by (71.8m points)

python - Why use contextlib.suppress as opposed to try/except with pass?

Why would one use contextlib.suppress to suppress an exception, instead of try/except with a pass?

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
>>> 
See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

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

vs.:

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

It also allows to express the intent:

  • with suppress(SpecificError): do_something() says don't propagate the error if it is raised while doing something
  • try: do_something() except SpecificError: pass says do something and don't propagate the error if it is raised

It is less important because most people won't notice the difference.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...