TIL - EAFP, LBYL


事件の発展


最初は、長期的なValidatorをスムーズに作成するときです.いろいろ条件文を表装してJsonResponseに返しましたが、try-これなら書く必要はないと思い、Googleでdjango if or tryという検索キーワードを検索しました.
後にスタックオーバーフローでEAFP、LBYLについての話を見ました.Looks Good To Meと知り合ったばかりの頃と同じような不思議を感じ、簡単に整理したいと思います.

EAFP


EAFPは「歯で歯を返す」の略で、「許しを請うのは許すより簡単だ」という意味です.
なぜか、バイク/UFOを買いたい韓国の有婦の夫の表現(いらない…?)
しかし、これは符号化スタイルであり、Pythonが推奨する(PEP 463)方式である.
EAFPは、いずれの操作を実行する前に、すべての操作の条件が正常であると仮定し、エラーが発生した場合に処理する.
try:
    min_value = data['min']
except KeyError:
    return "No Key 'min'"
try-exception文と同様に、コードは簡潔で直感的です.
このスタイルは、C、Javaなど他の言語でよく使われるLBYLとは逆です.

LBYL


LBYLは「Look BeforeYouLeap」の略で、「石橋も叩いて渡る」という俗語と一脈相通じる意味がある.つまり、いかなる行動をとる前に、すべての条件を確認して実行しなければならない.
このスタイルは主に複数の言語で使用されます.コードを表示すると、よく知っているかもしれません.
if 'min' in data:
    min_value = data['min']
else:
    return "No Key 'min'"
に示すように、if-elif(elseif)-else文を特徴とし、呼び出し、クエリーなどの操作の前に様々な条件をチェックして実行します.

EAFP vs LBYL


LBYLの場合、事前にすべての状況をコントロールすることができ、これは安全そうに見えますが、そうではありませんので、PythonはEAFPを使用することをお勧めします.
例えば、LBYLの使用はリスクをもたらす可能性があります.
if key in mapping:
    return mapping[key]
同じハーモニーがあると考えてみてください.条件文は、キーがオブジェクト上にあるかどうかをチェックし、ラベル記号を使用してキーの値にアクセスしています.マルチスレッド環境で非同期の場合、条件文を通過した後、キーの値が削除される可能性があるため、コードは失敗する可能性のあるコードです.
このような事態を防ぐために、Pythonはまず行動し、例外のEAFPを処理することを提案した.