Pythonにおけるベストプラクティス

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 None

Optional を使うことで、「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チャンネルもご覧ください。

YouTube Video