2016-01-02 8 views
13

contextlib.suppressを使用して、try/exceptの代わりにpassの例外を抑制する理由を教えてください。パスでtry/exceptと反対にcontextlib.suppressを使う理由は?

これらの2つの方法の間の文字の量には差(何が、 suppressは、複数の文字を持っている場合)、およびコードは、多くの場合、文字の代わりにLOCでカウントされていても、 suppresstryよりもはるかに遅いように思わはありません

/どちらの場合も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 
>>> 
+1

2行を保存します。 –

+0

同様に、forループを使用できるときに 'any()'または 'all()'を使うのはなぜですか?私は 'contextlib.suppress'を使うと読みやすさとメンテナンスに役立つと思います。 –

+2

@SimeonVisser 'any()'と 'all()' *は明らかにコードを短くします。 'any()'と 'all()'は 'for'ループよりもパフォーマンスが速いことも確信しています。私が見る限りでは、 'suppress'を使う唯一の理由は、それがもっと読みやすいということです。一方、 'try/except'を使うことは* much *速くなります。 –

答えて

6

読みやすさを犠牲にすることなく、2行少ないコードです。

ネストされたコードブロックまたは連続するコードブロックには、特に便利です。比較:

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と何かして伝播しませんeエラーが発生した場合

ほとんどの人が違いに気付かないため、それほど重要ではありません。

1

概念的には、私のために、contextlib.suppressのアプローチは、私はそのようなファイルを削除しようとするように発生する可能性があるエラーを(処理することができますそれは実際にそこにないかもしれない)。 try/exceptは、 'これは起こらないはずです'というイベントのより積極的な処理になります(例えば、0で割り切れる、または書きたい数を開くことができないなど)。

関連する問題