Python Language
Pythonのアンチパターン
サーチ…
過激な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つの症状を示しています。
-
except
型(行5)を除いて、KeyboardInterrupt
を含む健全な例外をキャッチします。これにより、プログラムが終了しないことがあります。 - exceptブロックはエラーを再評価しません。つまり、
get_result
内で例外が発生したのか、res
が空リストであるのかを判断できません。 - 最悪の場合、結果が空であることを心配すると、何かがひどく悪化しました。
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)
を使うことですが、多くの状況では、キーが存在しない場合にはもっと複雑な操作が必要になることがあります