Pythonのコーディング規約であるPEP8の命名規則に関して整理してみたいと思います。
Contents
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で特別な意味を持つ |
変数名や関数名等、各項目に適切なスタイルを以下に示します。
項目 | 適切なスタイル |
---|---|
定数名 | 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
というような形です。
例えば、クラスでプロパティとして制御されるような内部変数はプライベートな変数として定義しておく方がよいでしょう。プロパティについては「クラスのプロパティ(property)の使い方」を参考にしてください。また、クラスの変数でいえば外部プログラムから参照しても意味がないような変数もプライベートにしておくとよいです。
Pythonでは、プライベート変数と言っても厳密なプライベートではないため、変更することが可能です。ただし、Pythonに慣れ親しんだ人であれば、アンダースコアが先頭に1つ付与されているということで直接変更をしてほしくないプライベート変数であるということを理解します。
Pythonでは、アンダースコアを2つ付与することで名前変更(マングリング)が行われ、これにより変数の隠ぺいが意図されます。ただし、これは真のプライベートではなく、_[クラス名][元の名前]
の形式でアクセスが可能です。「クラスの定義と使い方」において、インスタンス変数の隠ぺいというところでも取り上げていますので興味があれば参考にしてください。
関数名とメソッド名
関数名やメソッドの名前には変数同様に「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」を使用します。クラスのプロパティについては「クラスのプロパティ(property)の使い方」を参考にしてください。
モジュール名とパッケージ名
モジュール名には「lowercase」で小文字の短い名前にすべきと言われています。読みやすくなるなら、アンダースコアをモジュール名に使っても構いません。
パッケージ名も同様でlowercaseの小文字の短い名前にすべきで、アンダースコアを使うのは推奨されません。
まとめ
Pythonのコーディング規約であるPEP8の命名規則に関して整理しました。
Pythonの公式なコーディング規約であるPEP8には、インデントや行の最大長などのスタイルに関する指示が多く記載されています。本記事では、その中でも特に命名規則に焦点を当てて整理しました。
私自身、コーディング中に命名規則に迷うことがしばしばあるので、この記事がPythonコーディングの際の参考として役立てば嬉しいです。