【Python】コーディング規約 PEP8の命名規則

Python のコーディング規約である PEP8 の命名規則に関して整理します。
目次
Python のコーディング規約 PEP8
PEP8 の概要
PEP8 は、Python プログラミングのコーディングスタイルに関する公式なガイドラインです。公式ドキュメントは以下を参照してください。pep8-jaの方は日本語ドキュメントになります。
そもそも PEP とは「Python Enhancement Proposal」の略で、Python 言語としての改善提案を文書化したものです。新しい機能の提案、既存機能の変更等、Python コミュニティ全体としての議論や合意について記録するための文書となっています。PEP8 はその中の 1 つです。
PEP8 には、インデントや行の最大長等のコーディングスタイルについても記載がありますが、本記事では特に PEP8 の命名規則について整理したいと思います。命名規則は、私も忘れてしまうことがあるので Python コーディングをする際の参考に使ってもらえればよいかと思います。
PEP8 に従うべきか
PEP8 のコーディング規約は必ず従うべきでしょうか? 答えは「PEP8 にこだわりすぎてはいけない」です。
PEP8 の冒頭に「A Foolish Consistency is the Hobgoblin of Little Minds (一貫性にこだわりすぎるのは、狭い心の現れである)」という項目が記載されており、PEP20 に記載のある「“Readability counts” (読みやすさは重要である)」も引用されています。
Python らしいシンプルで読みやすいコードというのは、よく Pythonic であると言われますが、コーディング規約よりも Pythonic であることを重視すべきです。Pythonic なプログラミングについては「Pythonicなプログラムコーディング」でまとめていますので参考にしてください。
プロジェクトでコーディング規約が整備されている場合は、プロジェクト内での品質や情報共有のしやすさを保つため、プロジェクトのコーディング規約に従ってください。
一方で、オープンソースの Python パッケージは PEP8 に従うのがおすすめです。PEP8 は標準的なコーディング規約のため多くの Python 開発者に利用されています。オープンソースとして世界の多くの開発者に協力を受ける場合には、統一感を持たせるためにも初めから PEP8 に準拠しておくことが重要です。開発が進行した後でコードのスタイルを変更するのは、大変な労力がかかり現実的ではありません。
PEP8 の命名規則
PEP8 での命名規則スタイルと、適用するにあたって参考になる考え方を整理します。
命名規則のスタイル
プログラミングの命名規則スタイルとしては、以下のようなスタイルが挙げられます。
| スタイル | 概要 |
|---|---|
CapitalizedWords (CamelCase) | 複数単語をつなげ、各単語の先頭を大文字にする |
mixedCase | 複数単語をつなげ、最初の単語を小文字、その後の単語の先頭を大文字にする |
UPPERCASE | 全ての文字を大文字にする |
UPPER_CASE_WITH_UNDER_SCORES | 大文字の単語をアンダースコアでつなげる |
lowercase | 全ての文字を小文字にする |
lower_case_with_underscores | 小文字の単語をアンダースコアでつなげる |
アンダースコア(_)を先頭や末尾につける | _value や value_ のように先頭か末尾にアンダースコアをつける(2重のアンダースコアもある)このスタイルは Python で特別な意味を持つ |
Python での変数名や関数名等、各項目に適切なスタイルを以下に示します。
| 項目 | 適切なスタイル |
|---|---|
| 定数名 | UPPERCASE またはUPPER_CASE_WITH_UNDERSCORES |
| パブリック変数名 | lowercase またはlower_case_with_underscores |
| プライベート変数名 | lowercase または lower_case_with_underscores で、先頭にアンダースコア 1 つ または 2 つ |
| 関数名とメソッド名 | lowercase またはlower_case_with_underscores |
| 特殊メソッド名 | 先頭と末尾に 2 重のアンダースコア(__) |
| 引数名 | lowercase またはlower_case_with_underscores |
| クラス名 | CapitalizedWords (CamelCase) |
| プロパティ名 | lowercase またはlower_case_with_underscores |
| モジュール名とパッケージ名 | lowercase |
使うべきではない文字
単一の文字 l (小文字のエル)、O (大文字のオー)、I(大文字のアイ) は、変数に使わないようにしましょう。これらの文字は、一部のフォントにおいて 0 や 1 と混同しやすいです。代わりに、より説明的な名前にしましょう。
定数名
定数は、プログラム実行中に変更されない値です。定数を表すグローバル変数には「UPPERCASE」または「UPPER_CASE_WITH_UNDERSCORES」を使います。
Pythonでは、定数として宣言しても値の変更は可能であるため、言語仕様として値の変更を禁止できる真の意味での定数は存在しませんが、大文字を用いることで定数であることの意図を示すことができます。
パブリック変数
パブリックな変数は、変更可能な変数で「lowercase」または「lower_case_with_underscores」を使用します。
クラスのパブリック変数といった外部から直接変更してもよい変数は、このルールに従います。また、関数内やメソッド内の変数も同様です。
プライベート変数名
プライベートな変数は「lowercase」または「lower_case_with_underscores」で先頭にアンダースコアを 1 つ付与します。例えば「_value」というような形です。
クラスでプロパティとして制御されるような内部変数は、プライベート変数として定義しておく方がよいでしょう。
Python では、プライベート変数と言っても厳密なプライベートではなく、変更が可能です。ただし、Pythonに慣れ親しんだ人であれば、アンダースコアが先頭に 1 つ付与されているということで直接変更をしてほしくないプライベート変数であるということを理解します。また、IDE では、こういったプライベート変数を考慮し、コード補完候補から除外してくれるものもあります。
Python では、アンダースコアを 2 つ付与することで名前変更(マングリング)が行われます。これは、アンダースコア 1 つの場合とは違い、名前が変わることから明確に変数が隠ぺいされます。ただし、これは真のプライベートというわけではなく _[クラス名][元の名前] の形式であれば、アクセスすることが可能になります。
関数名とメソッド名
関数名やメソッドの名前には変数同様に「lowercase」または「lower_case_with_underscores」を使用します。変数と同様にモジュール内のプライベートな関数を定義するときは先頭にアンダースコアをつける場合もあります。
Python の古いモジュールではこのルールを守っていないモジュールもありましたが、Python3 では多くの再編成を行って一貫したスタイルになってきています。
ライブラリでは mixedCase で定義しているフレームワークもあります。lowercase / lower_case_with_underscores なのか mixedCase なのかどちらに従うかはライブラリ開発の方針に従うようにしましょう。
特殊メソッド名
Python では、特殊メソッドというものがあります。名前の先頭と末尾で 2 重のアンダースコア(__)があるようなケースです。これらのメソッドは、プロトコルの実装を意味するものです。
この命名規則のメソッドは dunder メソッド(ダブルアンダースコアを短く発音したもの)と呼ばれることがあります。代表的なメソッドは、クラス定義のコンストラクタ __init__() などがあります。
通常開発する関数やメソッドでは、名前の先頭と末尾で 2 重のアンダースコア(__)をつけないように注意しましょう。
引数名
関数やメソッドの引数の名前には「lowercase」または「lower_case_with_underscores」を使用します。引数は、関数やメソッド内でのローカルな変数なので、上記で出てきた変数と同じ扱いです。
クラス名
クラス名には「CapitalizedWords (CapWords または CamelCase)」を使用します。変数や関数と同様に、モジュール内でのプライベートなクラスを定義する場合には、先頭にアンダースコアをつけることもあります。
プロパティ名
プロパティは「lowercase」または「lower_case_with_underscores」を使用します。
モジュール名とパッケージ名
モジュール名には「lowercase」で小文字の短い名前にすべきと言われています。読みやすくなるなら、アンダースコアをモジュール名に使っても構いません。
パッケージ名も同様で lowercase の小文字の短い名前にすべきで、アンダースコアを使うのは推奨されません。
まとめ
Python のコーディング規約である PEP8 の命名規則に関して整理しました。
Python の公式なコーディング規約である PEP8 には、インデントや行の最大長などのスタイルに関する指示が多く記載されています。本記事では、その中でも特に命名規則に焦点を当てて整理しました。
Python コーディングの際の参考として役立てていただければと思います。


に要素を追加・更新する方法.jpg)



の概念.jpg)
