Pythonにおけるベストプラクティス
この記事ではPythonにおけるベストプラクティスについて説明します。
Pythonのベストプラクティスを実際のコードサンプルと共に解説し、読みやすく保守しやすいコードの書き方を紹介します。
YouTube Video
Pythonにおけるベストプラクティス
可読性を最優先にする
まずは、「可読性を最優先にする」という点を見てみましょう。
Pythonは「読みやすさ」を重視する言語です。まずは一目で意図が分かるコードを書くことを最優先にしましょう。
1# Bad example: unclear variable names
2a = 10
3b = 5
4c = a * bこのコードでは、変数名から意味が読み取れず、後から見た人が理解するのに時間がかかります。
1# Good example: descriptive variable names
2price = 10
3quantity = 5
4total_cost = price * quantity変数名を具体的にするだけで、コードがそのまま説明書になります。
明示的なコードを書く
続いて、「明示的なコードを書く」という点を見てみましょう。
Pythonでは「暗黙的な動作」より「明示的な意図」が推奨されます。
1# Bad example: implicit truthy check
2if data:
3 process(data)このコードでは、data が何を期待しているのかが分かりにくく、バグの温床になります。
1# Good example: explicit condition
2if len(data) > 0:
3 process(data)条件を明示することで、コードの意図と仕様が一致します。
関数は小さく、1つの責務に集中させる
続いて、「関数は小さく、1つの責務に集中させる」という点を見てみましょう。
1つの関数が多くの仕事をすると、テストや修正が困難になります。
1# Bad example: doing too many things
2def handle_user(user):
3 save_to_database(user)
4 send_email(user)
5 write_log(user)このコードでは、処理が密結合になり、再利用や変更が難しくなります。
1# Good example: single responsibility
2def save_user(user):
3 save_to_database(user)
4
5def notify_user(user):
6 send_email(user)
7
8def log_user(user):
9 write_log(user)関数を分割することで、役割が明確になりテストもしやすくなります。
型ヒントを積極的に使う
続いて、「型ヒントを積極的に使う」という点を見てみましょう。
型ヒントはドキュメントであり、バグを未然に防ぐ強力な武器です。
1# Bad example: Without type hints
2def add(a, b):
3 return a + bこのコードでは、引数や戻り値の型が分からず、使い方を間違えやすくなります。
1# Good example: With type hints
2def add(a: int, b: int) -> int:
3 return a + b型ヒントにより、IDE補完・静的解析・可読性が大きく向上します。
None を返す可能性を明示する
続いて、「None を返す可能性を明示する」という点を見てみましょう。
None が返る関数は、使う側での考慮漏れが起きがちです。
1# Bad example: Ambiguous return value
2def find_user(user_id):
3 if user_id == 1:
4 return {"id": 1, "name": "Alice"}
5 return Noneこのコードでは、返り値が存在するのか不明確です。
1# Good example: explicit return type
2from typing import Optional, Dict, Any
3
4def find_user(user_id: int) -> Optional[Dict[str, Any]]:
5 if user_id == 1:
6 return {"id": 1, "name": "Alice"}
7 return NoneOptional を使うことで、「Noneが返る可能性」を型として伝えられます。
例外は広く捕まえすぎない
続いて、「例外は広く捕まえすぎない」という点を見てみましょう。
例外処理は「必要なものだけ」を捕まえるのが基本です。
1# Bad example: catching all exceptions
2try:
3 result = int(value)
4except Exception:
5 result = 0このコードでは、本来気づくべきバグまで隠してしまいます。
1# Good example: catch specific exception
2try:
3 result = int(value)
4except ValueError:
5 result = 0例外を限定することで、予期しない不具合を見逃しません。
with 文でリソースを安全に扱う
続いて、「with 文でリソースを安全に扱う」という点を見てみましょう。
ファイルやロックなどのリソースは、必ず確実に解放する必要があります。
1# Bad example: manual close
2file = open("data.txt")
3content = file.read()
4file.close()このコードでは、例外が発生すると close() が呼ばれない可能性があります。
1# Good example: using context manager
2with open("data.txt") as file:
3 content = file.read()with 文を使えば、例外が起きても安全に後始末されます。
リスト内包表記を適切に使う
続いて、「リスト内包表記を適切に使う」という点を見てみましょう。
シンプルな変換処理は、リスト内包表記で簡潔に書けます。
1# Bad example: Verbose loop
2squares = []
3for i in range(10):
4 squares.append(i * i)このコードでは、処理の本質が見えにくくなります。
1# Good example: Clear list comprehension
2squares = [i * i for i in range(10)]リスト内包表記を適切に使うことで、コードの可読性が向上します。
マジックナンバーを避ける
続いて、「マジックナンバーを避ける」という点を見てみましょう。
数値や文字列を直接書くと、意味が分からなくなります。
1# Bad example: magic number
2if status == 404:
3 handle_not_found()このコードでは、404 の意味を知っている前提のコードになります。
1# Good example: named constant
2NOT_FOUND = 404
3
4if status == NOT_FOUND:
5 handle_not_found()名前を付けることで、意図が明確になります。
「動く」ではなく「保守できる」コードを書く
最後に、『「動く」ではなく「保守できる」コードを書く』という点を見てみましょう。
重要なのは、未来の自分や他人が読めるかという視点です。
1# Bad example: Hard to maintain
2def f(x):
3 return x * 1.08 + 100このコードでは、仕様がコードから読み取れません。
1# Good example: Easy to maintain
2TAX_RATE = 1.08
3BASE_FEE = 100
4
5def calculate_total(price: float) -> float:
6 return price * TAX_RATE + BASE_FEE意味を名前に落とし込むことで、コード自体が仕様書になります。
まとめ
Pythonのベストプラクティスは、「賢く書く」より「分かりやすく書く」ことに集約されます。小さな習慣の積み重ねが、バグの少ない、長く使えるコードにつながります。
YouTubeチャンネルでは、Visual Studio Codeを用いて上記の記事を見ながら確認できます。 ぜひYouTubeチャンネルもご覧ください。