Pythonで「EAFPの原則を使用する」とはどういう意味ですか?例を挙げていただけますか?
3 に答える
用語集から:
許可よりも許しを求める方が簡単です。この一般的なPythonコーディングスタイルは、有効なキーまたは属性の存在を前提としており、その前提が誤りであることが判明した場合は例外をキャッチします。このクリーンで速いスタイルは、多くの
try
ステートメントexcept
の存在によって特徴付けられます。この手法は、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回検索する必要があり、少し読みにくいと見なされる場合もあります。
別の例で説明してみます。
ここでは、ファイルにアクセスして、コンソールでコンテンツを印刷しようとしています。
LBYL-飛躍する前に見てください:
ファイルにアクセスできるかどうかを確認し、アクセスできる場合は、ファイルを開いて内容を印刷します。ファイルにアクセスできない場合は、その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")
EAFP-許可よりも許しを求める方が簡単:
この例では、ファイルを開こうとしているだけで、開くことができない場合は、をスローし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())
私はそれを「楽観的プログラミング」と呼んでいます。アイデアは、ほとんどの場合、人々は正しいことをするだろうということであり、エラーは少ないはずです。したがって、最初に「正しいこと」が発生するようにコーディングし、発生しない場合はエラーをキャッチします。
私の考えでは、ユーザーがミスを犯す場合、時間の影響を受けるのはユーザーである必要があります。ツールを正しい方法で使用する人々はスピードアップされます。