PythonのEAFP/LBYLとは?「許可より許しを求める」プログラミング哲学とは
Pythonをブラウザで実行しながら実践的に学ぶ
Pythonの基礎からソフトウェアアーキテクチャ,アルゴリズムなどの応用的な内容まで幅広く学べます。
ブラウザ上で直接Pythonコードを試すことができ、実践的なスキルを身につけることが可能です。
Pythonのコードを書いていると、「EAFP」や「LBYL」という言葉を耳にしたことがあるかもしれません。
最初にこの言葉を聞いたとき、私は正直「何それ?」と思いました。 でも、この2つの考え方を理解すると、Pythonがなぜ“書きやすく、読みやすい”と言われるのかが腑に落ちるのです。
この記事では、EAFPとLBYLの違いを、実際のコード例を交えながら丁寧に解説します。 エンジニア歴10年の私が現場で感じてきたリアルな感覚も交えつつ、初心者でもわかりやすいように説明していきます。
EAFPとLBYLって何?¶
最初にそれぞれの言葉の意味を整理しておきましょう。 どちらもプログラムの書き方の考え方(哲学)を表しています。
用語 | 意味 | 日本語でのニュアンス |
---|---|---|
EAFP | Easier to Ask for Forgiveness than Permission | 「許可を取るより、許しを乞う方が簡単」 |
LBYL | Look Before You Leap | 「飛び込む前に見よ」=事前に確認してから行動する |
それぞれについて、詳しく解説します!
LBYL:「やる前に確認する」安全第一のスタイル¶
Python以外の多くの言語(特にC言語やJavaなど)では、このLBYL(Look Before You Leap)スタイルが一般的です。 つまり、「実行する前に、条件をチェックしてから実行する」という考え方ですね。
例えば、ファイルを開くとき。 ファイルが存在するかどうかを確認してから開こうとするコードを書きたくなります。
import os
filename = "data.txt"
if os.path.exists(filename):
with open(filename, "r") as f:
content = f.read()
print(content)
else:
print("ファイルが見つかりません。")
このように、事前に安全確認を行うのがLBYLスタイルです。実際、現場では「確認してから実行する」方が安心感があります。
特に重要なファイルやデータを扱う場合、想定外のエラーでプログラムが止まってしまうのは避けたいですよね。
EAFP:「まずはやってみて、ダメなら例外処理」¶
一方のEAFP(Easier to Ask for Forgiveness than Permission)は、Pythonらしい考え方です。 「まずはやってみよう。ダメだったらその時に謝ればいい(=例外処理で対応する)」という発想です。
同じことをEAFPで書くと、こうなります。
try:
with open("data.txt", "r") as f:
content = f.read()
print(content)
except FileNotFoundError:
print("ファイルが見つかりません。")
事前の確認はしていません。 「ファイルがあるかもしれないし、ないかもしれない。でも、とりあえず開いてみよう。なかったらその時考える。」
この潔さがEAFPスタイルの特徴です。
PythonがEAFPを好む理由¶
Pythonの世界では、EAFPが推奨される場面が多いです。 なぜかというと、Pythonの例外処理が非常に洗練されているからです。
try-except構文がシンプルで、読みやすく、かつ意図が明確に伝わるからです。 また、マルチスレッド環境などで同時アクセスが起こる可能性がある場合、LBYLは「確認した瞬間に状況が変わる」ことがあるため、信頼性が下がります。
たとえば、次のようなシチュエーションを考えてみてください。
import os
filename = "data.txt"
if os.path.exists(filename): # ここで確認しても…
# 直後に他のプロセスがファイルを削除したら?
with open(filename, "r") as f:
print(f.read())
このコードでは、チェックした直後に別のプロセスがファイルを削除した場合、結局エラーになります。
つまり、確認しても意味がないことがあるんですね。EAFPなら、その状況にも自然に対応できます。
EAFPとLBYLの違いをもう一度整理しよう¶
理解を深めるために、2つの考え方を表で整理してみましょう。
観点 | EAFP | LBYL |
---|---|---|
基本姿勢 | とりあえず実行して、失敗したら対処 | 実行前に安全確認 |
処理の流れ | try-except で例外処理 | if文などで事前チェック |
可読性 | Python的で読みやすい | 他言語出身者にはわかりやすい |
エラーへの強さ | 強い(例外で拾える) | 弱い(競合に弱い) |
実行速度 | 速い(条件判定が不要) | 場合によって遅くなる |
よく使われる場面 | ファイル操作、辞書アクセス、API呼び出しなど | 入力検証、危険な操作前の確認 |
実際の現場での使い分け方¶
私が仕事でPythonを書く中で感じるのは、EAFPとLBYLは「どちらが正しいか」ではなく、「どちらが適しているか」で使い分けるものだということです。
たとえば、社内の自動処理スクリプトではEAFPが圧倒的に多いです。 Pythonらしく短く書けて、try-exceptでエラーもスマートに処理できるからです。
data = {"name": "Taro"}
try:
print(data["age"]) # キーが存在しない場合
except KeyError:
print("年齢情報がありません。")
一方、ユーザー入力など、外部から予測不能なデータを扱う場合はLBYLを使うこともあります。 予想外のエラーが多発すると、EAFPではかえって読みにくくなるためです。
name = input("名前を入力してください: ")
if name:
print(f"こんにちは、{name}さん!")
else:
print("名前が入力されていません。")
このように、「外部データはLBYL」「システム内部ではEAFP」といったバランス感覚が大切です。
ありがちな失敗例と注意点¶
初心者のうちは「EAFPがPythonicだから全部EAFPで!」と考えがちですが、すべてのケースでEAFPが正しいわけではありません。
例えば、次のようなコードは、EAFPっぽいけど非効率です。
try:
result = int(input("数字を入力してください: "))
except Exception:
print("何かが間違っています。")
このように、例外を広く捕まえすぎると、どんなエラーが起きたのか分からなくなります。 Pythonの例外は、具体的に捕まえるのが原則です。
try:
result = int(input("数字を入力してください: "))
except ValueError:
print("数字を入力してください。")
EAFPを使うときも、何を許して何を許さないかを意識することが大切です。
EAFPとLBYLの哲学は、チーム開発にも影響する¶
この考え方は、単にコードの書き方だけでなく、チーム開発の文化にもつながります。
EAFP的なチームは「とりあえず試してみよう」「失敗したら直せばいい」というチャレンジ精神が強い傾向があります。 LBYL的なチームは「事前に確認しよう」「リスクを減らそう」という慎重さがあります。
どちらも大切ですが、Pythonの文化は明らかにEAFP寄りです。
そのため、PythonチームでLBYLすぎるコードを書くと、他の開発者から「ちょっと冗長だね」と感じられることもあります。
最後に:EAFPとLBYLを意識してPythonをもっと楽しもう¶
EAFPとLBYLは、どちらが良い・悪いという話ではありません。 むしろ、状況に応じて柔軟に使い分ける力こそがエンジニアの腕の見せどころです。
- EAFPは、Pythonの「失敗を前提にした優しさ」を象徴する哲学。
- LBYLは、確実性と安全性を重視する堅実な考え方。
どちらも知っていることで、あなたのPythonコードは一段と洗練されます。 そして、書くたびに「Pythonってやっぱり気持ちいい言語だな」と思えるはずです。