Python命名規則の基本とPEP8の整理について

Pythonの命名規則について詳しく解説した記事のサムネイルPython
この記事は約22分で読めます。

 

【サイト内のコードはご自由に個人利用・商用利用いただけます】

この記事では、プログラムの基礎知識を前提に話を進めています。

説明のためのコードや、サンプルコードもありますので、もちろん初心者でも理解できるように表現してあります。

基本的な知識があればカスタムコードを使って機能追加、目的を達成できるように作ってあります。

※この記事は、一般的にプロフェッショナルの指標とされる『実務経験10,000時間以上』を凌駕する現役のプログラマチームによって監修されています。

サイト内のコードを共有する場合は、参照元として引用して下さいますと幸いです

※Japanシーモアは、常に解説内容のわかりやすさや記事の品質に注力しております。不具合、分かりにくい説明や不適切な表現、動かないコードなど気になることがございましたら、記事の品質向上の為にお問い合わせフォームにてご共有いただけますと幸いです。
(送信された情報は、プライバシーポリシーのもと、厳正に取扱い、処分させていただきます。)

●Pythonの命名規則とは

Pythonを使ってプログラミングをする上で、命名規則は非常に重要な役割を果たします。

命名規則とは、変数名、関数名、クラス名などの識別子を付ける際のルールのことを指します。

○命名規則の重要性

適切な命名規則を守ることで、コードの可読性が向上し、保守性が高まります。

また、他の開発者とコードを共有する際にも、命名規則が統一されていることで、スムーズなコミュニケーションが可能になります。

私たちPythonエンジニアは、日々の業務で大量のコードを書いています。

そのコードは、自分だけでなく、チームメンバーや将来の自分が読み返すことを想定して書く必要があります。

例えば、ある変数に「x」という名前を付けたとします。

その時は自分にとって意味のある名前だったかもしれません。

しかし、1ヶ月後、半年後に見返した時に、「x」が何を表しているのか瞬時に理解できるでしょうか?

おそらく、理解するのに時間がかかったり、誤解を生んだりするはずです。

一方、「user_name」という名前であれば、ユーザーの名前を表しているということが一目瞭然です。

コードを見返す際も、その変数の意味を即座に理解することができます。

このように、適切な命名規則を守ることは、コードの可読性と保守性を高め、開発者間のコミュニケーションを円滑にするために欠かせません。

○PEP8の役割

PEP8は、Pythonの標準的なコーディング規約を定めたドキュメントです。

PEP8では、命名規則についても詳細なガイドラインが提示されています。

PEP8に準拠することで、Pythonコミュニティ内で広く受け入れられている命名規則に従うことができます。

これにより、他の開発者が書いたコードを読む際にも、スムーズに理解することが可能となります。

また、多くのPythonプロジェクトがPEP8に準拠しているため、PEP8の命名規則を身につけておくことは、オープンソースプロジェクトへの参加やコードレビューの際にも役立ちます。

○良い命名規則の特徴

では、具体的にどのような命名規則が良いとされているのでしょうか。

PEP8を参考にしつつ、良い命名規則の特徴をいくつか見ていきましょう。

  1. 読みやすく、意味が明確であること
  2. 一貫性があり、統一されていること
  3. 短すぎず、長すぎないこと
  4. 英語の単語を使用すること
  5. 大文字と小文字を適切に使い分けること

これらの特徴を満たす命名規則を心がけることで、可読性が高く、保守性に優れたコードを書くことができます。

例えば、「user_name」、「calculate_average」、「HttpResponse」といった名前は、これらの特徴を備えています。

それぞれ、ユーザーの名前、平均値を計算する関数、HTTPレスポンスを表すクラスであることが一目で理解できます。

良い命名規則を身につけるためには、PEP8を読み込むことが重要ですが、それだけでなく、実際のコードを書く中で常に意識することが大切です。

優れた命名規則は、一朝一夕で身につくものではありません。

日々の積み重ねの中で、少しずつ習慣づけていくことが求められます。

●変数名の命名規則

さて、Pythonの命名規則の中でも、特に重要なのが変数名の命名です。

変数は、プログラム中で頻繁に使用されるため、適切な名前を付けることが求められます。

PEP8によると、変数名は基本的に小文字のアンダースコア区切り(スネークケース)を使用することが推奨されています。

つまり、複数の単語からなる変数名は、単語間をアンダースコアで区切るという訳です。

○サンプルコード1:スネークケースを使った変数名の例

スネークケースを使った変数名の例を見てみましょう。

user_name = "John"
account_balance = 1000
is_active = True

これらの変数名は、それぞれユーザーの名前、口座残高、アクティブ状態を表しています。

スネークケースを使うことで、変数名の意味が明確になり、読みやすくなっていることがわかります。

○サンプルコード2:複数単語の変数名の命名方法

では、もう少し複雑な変数名の場合はどうでしょうか。

first_name = "John"
last_name = "Doe"
date_of_birth = "1990-01-01"

ここでも、スネークケースを使って、複数の単語からなる変数名を構成しています。

first_nameは名、last_nameは姓、date_of_birthは生年月日を表しています。

このように、スネークケースを使うことで、たとえ変数名が長くなっても、読みやすく理解しやすい名前を付けることができます。

○数字を含む変数名の扱い方

さらに、変数名に数字を含める場合についても見ておきましょう。

PEP8では、変数名に数字を使うことは可能ですが、できるだけ避けることが推奨されています。

数字を使う場合は、意味のある位置に配置し、可読性を損なわないように注意が必要です。

○サンプルコード3:数字を含む変数名の例

数字を含む変数名の例を見てみましょう。

user1_name = "John"
user2_name = "Alice"
http_status_code_404 = "Not Found"

user1_nameuser2_nameのように、同じ種類のデータに連番を付ける場合は、数字を使うことがあります。

ただし、単純にuser1user2とするのではなく、_nameを付けて意味を明確にしています。

また、http_status_code_404のように、数字自体が意味を持つ場合は、アンダースコアで区切って使用するのが一般的です。

ただし、数字の使用は最小限に留め、できるだけ意味のある名前を付けることが大切です。

例えば、http_status_code_not_foundという名前の方が、より意図が伝わりやすくなります。

●bool型変数の命名規則

Pythonでは、真偽値を表すbool型の変数をよく使用します。

このbool型の変数名を付ける際にも、PEP8のガイドラインに沿った命名が求められます。

bool型の変数名は、一見するとその変数が真偽値を表していることがわかるような名前を付けることが大切です。

そのためには、変数名の前に「is」や「has」などを付けるのが一般的です。

○サンプルコード4:is_ や has_ を使ったbool型変数の命名例

具体的なbool型変数の命名例を見てみましょう。

is_valid = True
has_error = False
is_logged_in = True

ここでは、is_validは「妥当である」、has_errorは「エラーがある」、is_logged_inは「ログインしている」といった意味を表しています。

変数名の前に「is」や「has」を付けることで、その変数がbool型であり、真偽を表していることが一目瞭然になります。

このような命名規則を採用することで、コードの可読性が大きく向上します。

実際に上記のコードを実行してみると、次のような結果が得られます。

print(is_valid)       # 出力: True
print(has_error)      # 出力: False
print(is_logged_in)   # 出力: True

bool型の変数は、条件分岐などで頻繁に使用されるため、適切な命名が特に重要です。

「is」や「has」を使った明確な名前を付けることで、コードの意図が伝わりやすくなります。

○avoid_confusion な命名の重要性

ただし、bool型の変数名を付ける際には、紛らわしい名前は避けるべきです。

例えば、「is_not」や「has_not」などのような否定形を使うと、かえって可読性が損なわれる恐れがあります。

また、「is」や「has」以外にも、「can」、「should」、「must」などのような単語を使うこともありますが、これらは必ずしもbool型を表すとは限りません。

変数の型と名前が一致していないと、混乱を招く可能性があります。

bool型の変数名を付ける際は、シンプルかつ明確で、誤解の余地がない名前を選ぶことが肝心です。

「is」や「has」を使った肯定形の名前を付けることを習慣づけておくと良いでしょう。

実際に、チーム内でbool型変数の命名規則を統一しておくことで、コードの一貫性が保たれ、可読性が向上します。

全てのメンバーが同じルールに従ってコードを書くことで、誰が見ても理解しやすいコードを実現できます。

●関数名の命名規則

さて、Pythonの命名規則の中でも、関数名の付け方は特に重要です。

関数は、コードの構造を決める重要な要素であり、適切な名前を付けることで、コードの可読性と保守性が大きく向上します。

PEP8のガイドラインによると、関数名も変数名と同様に、小文字のアンダースコア区切り(スネークケース)を使用することが推奨されています。

加えて、関数名には動詞を使うのが一般的です。

○サンプルコード5:動詞を使った関数名の例

動詞を使った関数名の例を見てみましょう。

def calculate_average(numbers):
    """数値のリストの平均値を計算する"""
    total = sum(numbers)
    count = len(numbers)
    average = total / count
    return average

def save_to_file(data, filename):
    """データをファイルに保存する"""
    with open(filename, 'w') as file:
        file.write(data)

def is_valid_email(email):
    """メールアドレスが有効かどうかを判定する"""
    # メールアドレスの有効性をチェックするロジック
    return True

ここでは、calculate_averageは「平均値を計算する」、save_to_fileは「ファイルに保存する」、is_valid_emailは「メールアドレスが有効かどうかを判定する」といった具合に、関数の動作を表す動詞を使っています。

こうすることで、関数名からその関数の目的や動作が明確になり、コードの理解が深まります。

また、関数名に動詞を使うことで、関数が「何かを行う」という性質を持っていることが強調されます。

上記のコードを実行すると、次のような結果が得られます。

numbers = [1, 2, 3, 4, 5]
avg = calculate_average(numbers)
print(avg)  # 出力: 3.0

data = "Hello, World!"
save_to_file(data, "output.txt")
# "output.txt"ファイルにデータが保存される

email = "test@example.com"
valid = is_valid_email(email)
print(valid)  # 出力: True

関数名に適切な動詞を使うことで、関数の目的が明確になり、コードの流れがスムーズに理解できるようになります。

○引数の命名のコツ

関数名だけでなく、引数の命名にもコツがあります。

引数は、関数の入力となるデータを表すため、その名前は明確で意味のあるものにする必要があります。

引数の名前は、関数の中でその引数がどのように使われるかを表すような名前を付けるのが良いでしょう。

例えば、numbersは数値のリスト、filenameはファイル名、emailはメールアドレスを表しています。

このように、引数の名前を適切に付けることで、関数の使い方がより明確になります。

関数を呼び出す側のコードを見ただけで、どのような引数を渡せば良いのかが一目瞭然になるのです。

実際のコーディングでは、関数名と引数名の命名に悩むことも多いかもしれません。

そんな時は、コードの可読性を最優先に考えて、シンプルで明確な名前を選ぶようにしましょう。

時には、関数の目的や引数の意味を表すために、少し長めの名前を付ける必要があるかもしれません。

しかし、それでも可読性が向上するのであれば、躊躇せず長い名前を使うべきです。

関数名と引数名の命名は、コーディングスキルを磨く上で欠かせない要素です。

日頃から意識して良い名前を付ける習慣を身につけておくことで、より質の高いコードを書けるようになるでしょう。

●クラス名の命名規則

Pythonでオブジェクト指向プログラミングを行う際に欠かせないのが、クラスの定義です。

クラスは、オブジェクトの設計図となるもので、そのクラス名の付け方にもPEP8のガイドラインがあります。

PEP8によると、クラス名はパスカルケース(アッパーキャメルケース)を使用することが推奨されています。

つまり、クラス名は単語の先頭を大文字にし、単語間をアンダースコアで区切らずに連結するという訳です。

○サンプルコード6:パスカルケースを使ったクラス名の例

パスカルケースを使ったクラス名の例を見てみましょう。

class UserProfile:
    """ユーザープロファイルを表すクラス"""
    def __init__(self, name, email):
        self.name = name
        self.email = email

class HTTPClient:
    """HTTPクライアントを表すクラス"""
    def __init__(self, url):
        self.url = url

    def send_request(self):
        # HTTPリクエストを送信するロジック
        pass

ここでは、UserProfileクラスとHTTPClientクラスを定義しています。

それぞれ、ユーザープロファイルとHTTPクライアントを表しており、クラス名はパスカルケースで記述されています。

このようにパスカルケースを使うことで、クラス名が変数名や関数名と明確に区別され、コードの可読性が向上します。

また、他の開発者がそのクラスを使う際にも、クラスであることが一目でわかるようになります。

上記のコードを使って、実際にクラスのインスタンスを作成してみましょう。

user = UserProfile("John Doe", "john@example.com")
print(user.name)  # 出力: John Doe
print(user.email)  # 出力: john@example.com

client = HTTPClient("https://example.com")
client.send_request()  # HTTPリクエストを送信

UserProfileクラスのインスタンスを作成し、nameemail属性にアクセスしています。

また、HTTPClientクラスのインスタンスを作成し、send_requestメソッドを呼び出しています。

クラス名をパスカルケースで記述することで、インスタンスの生成や属性・メソッドの呼び出しがスムーズに行えるようになります。

○例外クラスの命名方法

クラス名の命名において、特に注意が必要なのが例外クラスです。

例外クラスは、エラーや例外的な状況を表すためのクラスであり、その名前は「Error」や「Exception」で終わるのが一般的です。

例えば、ValueErrorFileNotFoundErrorCustomExceptionなどのように、例外クラス名にはエラーや例外の内容を表す単語を含め、最後に「Error」や「Exception」を付けます。

これにより、例外クラスであることが明確になり、コードの読み手にとってもわかりやすくなります。

また、カスタム例外クラスを定義する際は、組み込みの例外クラスを継承するのが一般的です。

これにより、カスタム例外クラスが標準の例外クラスと同様に扱えるようになります。

クラス名の命名は、コードの設計において重要な役割を果たします。

パスカルケースを使い、例外クラスには適切なサフィックスを付けることで、クラスの目的や性質が明確になります。

日頃からこれらの命名規則を意識してコーディングを行うことで、より読みやすく保守性の高いコードを書けるようになるでしょう。

クラス名の命名は、変数名や関数名の命名と並んで、Pythonの命名規則の中でも特に重要な要素です。

しっかりとPEP8のガイドラインを理解し、適切な命名を心がけることが大切です。

●アンダースコアを使った命名

Pythonの命名規則の中でも、アンダースコアを使った命名は特に重要です。

アンダースコアを使うことで、変数やメソッドの可視性を制御したり、特殊な意味を持たせたりすることができます。

アンダースコアを使った命名には、大きく分けて2つのパターンがあります。

1つは先頭にアンダースコアを1つ付ける方法、もう1つは先頭と末尾にアンダースコアを2つずつ付ける方法です。

○サンプルコード7:先頭の _ を使った非公開属性の例

まずは、先頭にアンダースコアを1つ付ける方法から見ていきましょう。

class User:
    def __init__(self, name, email):
        self.name = name
        self._email = email

    def get_email(self):
        return self._email

user = User("John Doe", "john@example.com")
print(user.name)  # 出力: John Doe
print(user._email)  # 出力: john@example.com

ここでは、Userクラスの_email属性に注目してください。

先頭にアンダースコアを1つ付けることで、その属性が非公開(プライベート)であることを示しています。

非公開属性は、クラスの外部からアクセスすることは推奨されません。

ただし、Pythonではアクセス制限を厳密に強制はしないため、あくまでも「この属性は外部からアクセスするべきではない」という開発者の意図を表しているに過ぎません。

実際に上記のコードを実行すると、user._emailとしてアクセスできてしまいますが、これは推奨されない方法です。

非公開属性にアクセスする場合は、get_emailメソッドのようなゲッターメソッドを介して行うのが一般的です。

○サンプルコード8:先頭と末尾の __ を使った特殊メソッドの例

続いて、先頭と末尾にアンダースコアを2つずつ付ける方法を見ていきましょう。

class MyClass:
    def __init__(self):
        self.__private_attr = 42

    def __special_method(self):
        print("This is a special method.")

obj = MyClass()
print(obj.__private_attr)  # エラー: AttributeError
obj.__special_method()  # エラー: AttributeError

先頭と末尾にアンダースコアを2つずつ付けた__private_attr__special_methodは、特殊な意味を持っています。

__private_attrのように、先頭にアンダースコアを2つ付けた属性は、名前マングリング(name mangling)と呼ばれる機能によって、外部からアクセスできないようになります。

上記のコードでは、obj.__private_attrとしてアクセスしようとするとエラーが発生します。

一方、__special_methodのように、先頭と末尾の両方にアンダースコアを2つずつ付けたメソッドは、特殊メソッド(マジックメソッド)と呼ばれます。

特殊メソッドは、Pythonが内部的に使用するメソッドであり、通常はユーザーが直接呼び出すことはありません。

○アンダースコアの使い分け

アンダースコアを使った命名は、次のように使い分けるのが一般的です。

  • 先頭にアンダースコア1つ(_) -> 非公開属性やメソッドを表す。外部からのアクセスは推奨されない。
  • 先頭にアンダースコア2つ(__) -> 名前マングリングされる属性やメソッド。外部からはアクセスできない。
  • 先頭と末尾にアンダースコア2つ(__) -> 特殊メソッド。Pythonが内部的に使用し、ユーザーが直接呼び出すことは少ない。

これらのアンダースコアを使った命名規則を理解し、適切に使い分けることで、コードの可読性と保守性が向上します。

特に、非公開属性やメソッドを示すために先頭にアンダースコアを付ける習慣は、チームでのコード共有やライブラリの開発において重要です。

外部からアクセスするべきでない部分を明示することで、コードの意図が伝わりやすくなります。

ただし、あくまでもアンダースコアによる非公開は「紳士協定」のようなもので、厳密にアクセスを制限するものではないことに注意が必要です。

アンダースコアを使った命名は、Pythonの命名規則の中でも特に重要な要素の1つです。

適切に使い分けることで、コードの可読性と保守性が向上し、他の開発者とのコミュニケーションもスムーズになるでしょう。

●よくある命名のアンチパターン

Pythonの命名規則を学ぶ中で、避けるべきアンチパターンも知っておくことが大切です。

よくある命名のアンチパターンを理解することで、より良い命名習慣を身につけることができるでしょう。

○略語や省略形を使いすぎない

略語や省略形を使いすぎるのは、命名のアンチパターンの1つです。

例えば、usrpwdのように、一般的に使われる略語であれば問題ありませんが、upのように極端に短い略語は避けるべきです。

また、自分だけがわかるような略語や省略形を使うのも避けましょう。

calc_avgのように、ある程度は略語を使っても構いませんが、c_aのように意味不明な略語は読み手を混乱させます。

略語や省略形を使う場合は、チーム内で合意された略語集を作るなどして、統一性を保つことが大切です。

コードを読む人全員がその略語の意味を理解できるようにしておく必要があります。

○ハンガリアン記法は避ける

ハンガリアン記法とは、変数名の前に型を表す接頭辞を付ける命名規則です。

例えば、intCountstrNameのように、変数名の前にintstrを付けるような方法です。

しかし、Pythonではハンガリアン記法は推奨されていません。

Pythonは動的型付け言語であり、変数の型は実行時に決定されるため、型を表す接頭辞を付ける必要がないからです。

また、ハンガリアン記法を使うと、変数名が長くなりがちで、かえって可読性が損なわれる恐れがあります。

Pythonでは、変数名自体に意味のある名前を付けることが重要視されています。

○一文字の変数名は控えめに

一文字の変数名は、ループの制御変数などで一時的に使う場合は問題ありませんが、それ以外では控えめにすべきです。

例えば、ijはループの制御変数としてよく使われますが、それ以外の用途で使うのは避けましょう。

また、l(エル)やO(オー)、I(アイ)などは、数字の10と見間違えやすいため、特に注意が必要です。

フォントによっては区別がつきにくいこともあるので、可能な限り使わないようにしましょう。

一文字の変数名は、その変数の役割が明確で、コードの文脈から意味が簡単に推測できる場合に限って使うようにすることが大切です。

命名のアンチパターンを避けることで、可読性の高いコードを書くことができます。

略語や省略形、ハンガリアン記法、一文字の変数名などは、できるだけ使わないように心がけましょう。

代わりに、変数名や関数名、クラス名には、その役割や目的を表す意味のある名前を付けるようにします。

コードを読む人が、名前を見ただけで大まかな意味が伝わるような名前を選ぶことが重要です。

命名規則は、個人の好みや経験によって異なる部分もありますが、PEP8のガイドラインに従い、チーム内で一貫性を保つことが何より大切です。

●命名規則を習慣づけるコツ

さて、ここまでPythonの命名規則について詳しく見てきましたが、実際にその規則を習慣づけるにはどうすれば良いのでしょうか。

良い命名規則を身につけるためには、意識的に実践することが大切です。

最初のうちは、命名規則を意識してコードを書くことに慣れていないかもしれません。

しかし、日々の積み重ねの中で、徐々に習慣化していくことが重要なのです。

○コードレビューで命名規則をチェック

習慣づけるためのコツの1つが、コードレビューで命名規則をチェックすることです。

チーム内でコードレビューを行う際に、命名規則に沿っているかどうかを確認するのです。

例えば、変数名がスネークケースになっているか、関数名に動詞が使われているか、クラス名がパスカルケースになっているかなど、PEP8のガイドラインに準拠しているかをチェックします。

コードレビューで指摘を受けることで、自分の命名習慣を見直すきっかけになります。

また、他の開発者のコードをレビューすることで、良い命名例を学ぶこともできるでしょう。

コードレビューを通して、チーム内で命名規則に対する意識を高め、一貫性のあるコードを書く習慣を身につけていくことが大切です。

○リファクタリング時に命名を見直す

また、リファクタリング時に命名を見直すのも効果的です。

リファクタリングとは、コードの動作を変えずに、内部構造を改善することを指します。

リファクタリングを行う際には、変数名や関数名、クラス名などの命名が適切かどうかを確認し、必要に応じて修正します。

例えば、calc_avgという関数名をcalculate_averageに変更したり、usr_idという変数名をuser_idに変更したりするような、命名の改善を行うのです。

リファクタリング時に命名を見直すことで、コードの可読性が向上し、保守性が高まります。

また、自分の命名習慣を振り返り、改善点を見つける良い機会にもなるでしょう。

○IDEの機能を活用する

最後に、IDEの機能を活用するのもおすすめです。

PyCharmやVS Codeなどの統合開発環境(IDE)には、命名規則をチェックする機能が備わっています。

これらのIDEでは、PEP8に準拠していない命名があれば警告を出してくれます。

例えば、変数名がスネークケースになっていない場合や、関数名に大文字が使われている場合などです。

IDEの警告を参考にして、命名規則に沿った修正を行うことで、自然と良い命名習慣が身についていきます。

また、IDEの自動補完機能を使えば、一貫性のある命名を素早く入力することもできるでしょう。

IDEの機能を上手く活用することで、命名規則を習慣づけるための負担を減らすことができます。

まとめ

Pythonの命名規則は、コードの可読性と保守性を高めるために欠かせない要素です。

PEP8のガイドラインに沿って、変数名はスネークケース、関数名は動詞を使ったスネークケース、クラス名はパスカルケースを使うことが推奨されています。

また、アンダースコアを使って非公開属性や特殊メソッドを表現することも重要です。

良い命名規則を習慣づけるためには、コードレビューやリファクタリング、IDEの機能を活用することが効果的です。

チーム内で命名規則を共有し、一貫性のあるコードを書く文化を育てていくことが、プロジェクトの成功につながるでしょう。

本記事を通して、Pythonの命名規則について理解を深めていただけたでしょうか。サンプルコードを交えて、実践的な命名方法を解説してきました。

ここで学んだ知識を活かして、より読みやすく保守性の高いPythonコードを書いていただければ幸いです。

最後まで読んでいただき、ありがとうございました。

これからも、Pythonのベストプラクティスを学び、より良いコードを書いていきましょう。