<一覧に戻る

Pythonの命名規則

「変数名や関数名、どう付けたらいいの?」と迷ったことはありませんか。

Pythonでは、名前の付け方ひとつでコードの読みやすさや保守性が大きく変わります。将来の自分や同僚が読んだときにすぐ理解できるようにすることが、良いプログラマーへの近道です。このページでは、Pythonの命名規則(PEP 8に沿った基本)を、初学者にもわかりやすく具体例と一緒に解説します。

命名の基本ルール(変数・関数に共通)

まずは土台となるルールから確認しましょう。迷ったときはここに立ち返ると安心です。

  • 使える文字は英数字とアンダースコア(_)です。日本語名や絵文字も技術的には使えますが、可読性や他環境での互換性を考えると避けましょう。
  • 先頭に数字は使えません(例: 1count は不可、count1 は可)。
  • 大文字と小文字は区別されます(total と Total は別物)。
  • 特殊文字(@, #, $, %, など)は使えません。
  • Pythonの予約語(class, for, if など)は使えません。どうしても近い名前にしたいときは末尾にアンダースコアを付けます(class_ など)。
  • 紛らわしい文字(小文字の l、数字の 1、大文字の O と数字の 0)は避けましょう。たとえば l1O0 は最悪の例です。

「3か月後の自分が読んでも、ひと目で意図が伝わるか?」を基準に考えると、名前の質が自然と上がります。

スネークケース(snake_case)を基本に

Pythonでは、変数名と関数名にスネークケース(単語をアンダースコアでつなぐ)を使うのが基本です。 キャメルケースに慣れている人は、最初少し違和感があるかもしれませんが、Pythonコミュニティではこちらが標準です。

# 良い例(snake_case)
user_age = 25
total_price = 100.50

# 悪い例(Pythonでは非推奨)
UserAge = 25     # これはクラス名のスタイル
totalPrice = 100.50  # camelCase

また、ブール値(True/False)には is_, has_, can_ のような接頭辞を付けると読みやすくなります。

is_active = True
has_error = False
can_execute = True

コレクション(リストや辞書など)には、複数形や中身がわかる名前を使うと、コードを追いやすくなります。たとえば users はユーザーの一覧、user_by_id は「IDをキーにしたユーザー辞書」という意図が伝わります。

定数は大文字スネークケース(SCREAMING_SNAKE_CASE)

一度決めたら実行中に変えない値は定数として、すべて大文字+アンダースコアで書きます。 Pythonには厳密な定数はありませんが、慣習として変更しないことを示します。

MAX_CONNECTIONS = 100
API_BASE_URL = "https://api.example.com"
DEFAULT_TIMEOUT_SEC = 30

定数は基本的にモジュールの先頭(グローバル)にまとめて置くと探しやすくなります。 環境ごとに変える値(APIキーやエンドポイントなど)は、別ファイルや環境変数で管理すると、より安全です。

クラス名はキャメルケース(CapWords)

クラス名は各単語の先頭を大文字にするキャメルケースにします。

名詞(もの・概念)で表すと意図が伝わりやすくなります。

class UserProfile:
    pass

class ShoppingCart:
    pass

頭字語(HTTP, URL など)が含まれる場合、クラス名では HTTPServer のように大文字のままつなげるのが一般的です。対して、変数・関数では http_server のように小文字で統一します。

クラス内部の外に出したくない属性には先頭にアンダースコアを付けます(_balance など)。 ダブルアンダースコア(__name)は特殊な名前マングリングを起こすため、まずはシングルアンダースコアで十分です。

関数名は動詞から始め、処理の意図を短く明確に

関数名は snake_case で、何をするのかを一言で表しましょう。 迷ったら「動詞+目的語」が基本形です。

def calculate_total(price, tax):
    return price + tax

def get_user_info(user_id):
    # ユーザー情報を取得する処理
    pass

取得は get、作成は create、更新は update、削除は delete、変換は to_〜/convert_〜 など、チームで言葉を揃えるとコード全体が読みやすくなります。 「やってみたら副作用もあった」関数は、名前に動作を混ぜると誤解を防げます(fetch_and_cache_user など)。

モジュール・パッケージ・ファイル名

意外と見落としがちですが、ファイル名やディレクトリ名も命名規則の一部です。読みやすさとインポートのしやすさを意識しましょう。

  • すべて小文字を基本に、必要に応じてアンダースコアを使います(data_loader.py、user_service.py)。
  • 名前は短く、役割が伝わるものにします(utils.py の乱用は避け、目的別に分ける)。
  • パッケージ(ディレクトリ)名も小文字で統一します。

アンダースコアの使い分け、ちゃんと理解できていますか?

アンダースコアには「ただの区切り」以上の意味があります。曖昧なまま使っていませんか?

  • 先頭に1つ(_name): 「内部用(非公開)」の目印。外部から使わない前提の属性や関数に。
  • 末尾に1つ(class_): 予約語との衝突を避けるときに使用(class は使えないため)。
  • 両端に2つ(init など): Pythonが特別扱いする「マジックメソッド」。自作の通常名で使うのは避けましょう。
  • 単独のアンダースコア(_): 使わない一時変数の受け皿として便利です。
for _ in range(3):
    do_something()

サンプルコード(命名規則を反映)

実際のコードで、命名がどのように効いてくるのかを体感してみましょう。次の例はシンプルなショッピングカートです。

class ShoppingCart:
    def __init__(self):
        self.items = []

    def add_item(self, item_name, item_price):
        item = {
            'name': item_name,
            'price': item_price
        }
        self.items.append(item)

    def calculate_total(self):
        total = 0
        for item in self.items:
            total += item['price']
        return total

    def display_items(self):
        for item in self.items:
            print(f"Item: {item['name']}, Price: {item['price']}")

# 使用例
cart = ShoppingCart()
cart.add_item('Apple', 0.5)
cart.add_item('Banana', 0.3)
cart.display_items()
print(f"Total Price: {cart.calculate_total()}")

このコードでは、クラス名に ShoppingCart(キャメルケース)、メソッド名と属性名に add_item や calculate_total、items(スネークケース)を使い、Pythonの一般的なスタイルに合わせています。

メソッド名は動詞から始まり、それぞれの役割が短い名前に凝縮されています。 たとえば add_item は「アイテムを追加する」動作、calculate_total は「合計を計算する」動作が直感的に伝わります。属性 items は複数形にすることで「複数のアイテムを持つリスト」だとすぐに分かります。

辞書のキー name と price も短くシンプルで、余計な装飾や曖昧な略語を避けています。このように命名だけで、コメントを増やさなくてもコードの意図が自然に読み取れるようになります。

まとめ

命名は「小さな投資で大きな効果」が得られる最強のリファクタリングです。スネークケースとキャメルケースの使い分け、定数やブール値の表現、アンダースコアの意味など、基本をそろえるだけでコードの読みやすさは見違えるはずです。

次にコードを書くとき、「この名前は未来の自分を助けるだろうか?」と一度問いかけてみてください。きっと、より伝わる Python コードになります。

一覧に戻る

出力結果: