サーチ…


過激なexcept節

例外は強力ですが、1つの過度のexcept節ですべてを1行にまとめることができます。

try:
    res = get_result()
    res = res[0]
    log('got result: %r' % res)
except:
    if not res:
        res = ''
    print('got exception')

この例では、反パターンの3つの症状を示しています。

  1. except型(行5)を除いて、 KeyboardInterruptを含む健全な例外をキャッチします。これにより、プログラムが終了しないことがあります。
  2. exceptブロックはエラーを再評価しません。つまり、 get_result内で例外が発生したのか、 resが空リストであるのかを判断できません。
  3. 最悪の場合、結果が空であることを心配すると、何かがひどく悪化しました。 get_resultが失敗すると、 resは完全に設定されずに残り、exceptブロックのresへの参照はNameErrorを発生させ、元のエラーを完全にマスクします。

あなたが処理しようとしている例外のタイプについて常に考えてください。 例外ページに読み取りを与え基本的な例外がどのようなものかを知る。

上の例の固定バージョンです:

import traceback

try:
    res = get_result()
except Exception: 
    log_exception(traceback.format_exc())
    raise
try:
    res = res[0]
except IndexError:
    res = ''

log('got result: %r' % res)

私たちはより具体的な例外を捕捉し、必要な箇所を再検討します。いくつかの行が、無限に正確です。

あなたがプロセッサー集約型の関数で飛躍する前に

プログラムは、プロセッサ集約型の関数を複数回呼び出すことによって、時間を簡単に浪費できます。

入力ならば、それは整数を返します。たとえば、次のようになります機能取るvalue 1、それ以外の生産することはできませんNone

def intensive_f(value): # int -> Optional[int]
   # complex, and time-consuming code
   if process_has_failed:
       return None
   return integer_output

そして、次のように使用することができます:

x = 5
if intensive_f(x) is not None:
    print(intensive_f(x) / 2)
else:
    print(x, "could not be processed")

print(x)

これはうまくいくが、 intensive_fを呼び出すという問題があり、コードの実行時間が2倍になる。よりよい解決策は、あらかじめ関数の戻り値を取得することです。

x = 5
result = intensive_f(x)
if result is not None:
    print(result / 2)
else:
    print(x, "could not be processed")

しかし、より明確で多分もっと難解なやり方は、例外を使うことです。例えば:

x = 5
try:
    print(intensive_f(x) / 2)
except TypeError: # The exception raised if None + 1 is attempted
    print(x, "could not be processed")

ここでは一時変数は必要ありません。 assert文を使用し、代わりにAssertionErrorを捕捉assertが望ましいことがよくあります。

辞書キー

これが見つかる場所の一般的な例は、辞書キーにアクセスすることです。例えば、

bird_speeds = get_very_long_dictionary()

if "european swallow" in bird_speeds:
    speed = bird_speeds["european swallow"]
else:
    speed = input("What is the air-speed velocity of an unladen swallow?")

print(speed)

with:

bird_speeds = get_very_long_dictionary()

try:
    speed = bird_speeds["european swallow"]
except KeyError:
    speed = input("What is the air-speed velocity of an unladen swallow?")

print(speed)

最初の例では、辞書を2回見なければなりません。長い辞書であるため、毎回そうするのに時間がかかるかもしれません。 2番目の方法は、辞書を1回だけ検索する必要があるため、多くのプロセッサ時間を節約できます。

これに代わる方法はdict.get(key, default)を使うことですが、多くの状況では、キーが存在しない場合にはもっと複雑な操作が必要になることがあります



Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow