回答:
用語集から:
許可より許しを求める方が簡単です。この一般的なPythonコーディングスタイルは、有効なキーまたは属性の存在を想定しており、想定が誤っていることが判明した場合は例外をキャッチします。このクリーンで速いスタイルは、多数の
try
andexcept
ステートメントの存在によって特徴付けられます。この手法は、Cなどの他の多くの言語に共通のLBYLスタイルとは対照的です。
例としては、辞書のキーにアクセスする試みがあります。
EAFP:
try:
x = my_dict["key"]
except KeyError:
# handle missing key
LBYL:
if "key" in my_dict:
x = my_dict["key"]
else:
# handle missing key
LBYLバージョンは、辞書内のキーを2回検索する必要があり、読みにくいと見なされることもあります。
x
たキーが存在しない場合:x = mydict.get('key')
返されますNone
場合'key'
ではありませんmy_dict
。また、を実行することもできます.get('key', <something>)
。キーが辞書にない場合は、xに何かが割り当てられます。dict.setdefault()
また、collections.defaultdict
過剰なコードを回避するためにも役立ちます。
except KeyError
だけでなく、として、AttributeError
単純だが、最悪の例のいくつかです。何度もexcept AttributeError
間違った場所に置かれたために何かをデバッグするのに行き詰まり、チェーンのより深いところで発生した誤った属性エラーをキャッチしてしまいました。私が思うより良い例は以下の通りですtry: open() ... except: IOError
。またはtry: parseLine() ... except ParseError
別の例で説明してみます。
ここでは、ファイルにアクセスして内容をコンソールに出力しようとしています。
ファイルにアクセスできるかどうかを確認し、アクセスできる場合は、ファイルを開いて内容を印刷します。ファイルにアクセスできない場合は、そのelse
部分にヒットします。これが競合状態である理由は、最初にアクセスチェックを行うためです。到達するまでに、with open(my_file) as f:
いくつかのアクセス許可の問題(たとえば、別のプロセスが排他的なファイルロックを取得するなど)のためにアクセスできなくなっている可能性があります。このコードはエラーをスローする可能性が高く、ファイルにアクセスできると考えていたため、そのエラーをキャッチできません。
import os
my_file = "/path/to/my/file.txt"
# Race condition
if os.access(my_file, os.R_OK):
with open(my_file) as f:
print(f.read())
else:
print("File can't be accessed")
この例では、ファイルを開こうとしているだけで、開けない場合はをスローしIOError
ます。可能であれば、ファイルを開いて内容を印刷します。だから私たちは何かを求めているのではなく、それをやろうとしているのです。うまくいけば、素晴らしい!そうでない場合は、エラーをキャッチして処理します。
# # No race condition
try:
f = open(my_file)
except IOError as e:
print("File can't be accessed")
else:
with f:
print(f.read())