165

Pythonで「EAFPの原則を使用する」とはどういう意味ですか?例を挙げていただけますか?

4

3 に答える 3

260

用語集から:

許可よりも許しを求める方が簡単です。この一般的な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回検索する必要があり、少し読みにくいと見なされる場合もあります。

于 2012-07-06T10:56:31.237 に答える
24

別の例で説明してみます。

ここでは、ファイルにアクセスして、コンソールでコンテンツを印刷しようとしています。

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())
于 2019-05-08T08:50:16.887 に答える
7

私はそれを「楽観的プログラミング」と呼んでいます。アイデアは、ほとんどの場合、人々は正しいことをするだろうということであり、エラーは少ないはずです。したがって、最初に「正しいこと」が発生するようにコーディングし、発生しない場合はエラーをキャッチします。

私の考えでは、ユーザーがミスを犯す場合、時間の影響を受けるのはユーザーである必要があります。ツールを正しい方法で使用する人々はスピードアップされます。

于 2018-05-29T05:28:06.610 に答える