Pythonのコーディング規約であるPEP8の命名規則に関して整理してみたいと思います。
Contents
Pythonのコーディング規約 PEP8
PEP8の概要
PEP8は、Pythonプログラミングのコーディングスタイルに関する公式なガイドラインです。公式ドキュメントは以下を参照してください。pep8-jaの方は日本語ドキュメントです。
そもそもPEPとは、「Python Enhancement Proposal」の略称であり、Python言語としての改善提案を文書化したものです。新しい機能の提案、既存機能の変更等、Pythonコミュニティ全体としての議論や合意について記録するための文書となっています。そのうちの8が、PEP8というわけです。
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であれば「複数単語をつなげて各単語の先頭が大文字」という表現です。
命名規則スタイルを一覧にしてみると以下のようになります。
スタイル | 概要 |
---|---|
CapitalizedWords (CapWords または CamelCase) | 複数単語をつなげて各単語の先頭が大文字 |
mixedCase | 複数単語をつなげて先頭は小文字、その他の単語の先頭が大文字 |
UPPERCASE | 全て大文字 |
UPPER_CASE_WITH_UNDER_SCORES | 大文字をアンダースコアでつなげる |
lowercase | 全て小文字 |
lower_case_with_underscores | 小文字をアンダースコアでつなげる |
先頭や末尾がアンダースコア(_) | 「_value」や「value_」のように先頭か末尾をアンダースコア (アンダースコアは2重にする場合もある) |
先頭や末尾がアンダースコアというのは後述しますが、Pythonでは意味を持っている特別な記載方法です。
変数名や関数名等、各項目についてのどのスタイルが適切か一覧として整理したものが以下になります。以降では、各項目について個別に詳細を説明していきます。
項目 | 適切なスタイル |
---|---|
定数名 | UPPERCASE または UPPER_CASE_WITH_UNDERSCORES |
パブリック(public)変数名 | lowercase または lower_case_with_underscores |
プライベート(private)変数名 | lowercase または lower_case_with_underscores で 先頭にアンダースコア 1つ または 2つ |
関数名とメソッド名 | lowercase または lower_case_with_underscores |
特殊メソッド名 | 先頭と末尾に2重のアンダースコア |
引数名 | lowercase または lower_case_with_underscores |
クラス名 | CapitalizedWords |
プロパティ名 | lowercase または lower_case_with_underscores |
モジュール名とパッケージ名 | lowercase |
使うべきではない文字
単一の文字 ‘l’ (小文字のエル)、’O’ (大文字のオー)、’I'(大文字のアイ) を決して変数に使わないようにしましょう。これらの文字は、フォントによって0や1といった数字と区別がつかないことがあります。 ‘l’ (小文字のエル)を使いたくなったら、大文字の’L’を代わりに使うことを検討しましょう。
定数名
定数は、プログラム実行中に変更されない値です。定数を表すグローバル変数には「UPPERCASE」または「UPPER_CASE_WITH_UNDERSCORES」を使います。
C/C++言語では、constという修飾子を使って定数を定義します。C/C++は実行前にコンパイルが必要な言語のため、constがついた定数を変更しようとするとコンパイルエラーになります。
しかし、Pythonではconstのような本物の定数は定義することができず、どのような変数も変更することが可能です。そのため、大文字での表記という分かりやすい命名をすることで、定数であるという意図を表現します。
パブリック(public)変数
パブリック(public)な変数は、変更可能な変数で「lowercase」または「lower_case_with_underscores」を使用します。
クラスのパブリック変数といった外部から直接変更してもよいような変数は、このルールに従います。また、関数内やメソッド内の変数も同様です。
プライベート(private)変数名
プライベート(private)な変数は「lowercase」または「lower_case_with_underscores」で先頭にアンダースコアを1つ付与します。「_name」というような形です。
例えば、クラスでプロパティとして制御されるような内部変数はプライベートな変数として定義しておく方がよいでしょう。プロパティについては「クラスのプロパティ(property)の使い方」を参考にしてください。また、クラスの変数でいえば外部プログラムから参照しても意味がないような変数もプライベートにしておくとよいです。
Pythonでは、プライベート変数と言っても厳密なプライベートではないため、変更することが可能です。ただし、Pythonに慣れ親しんだ人であれば、アンダースコアが先頭に1つ付与されているということで直接変更をしてほしくないプライベート変数であるということを理解します。
なお、アンダースコアを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の命名規則に関して整理してみました。
PEP8は、Pythonプログラミングのコーディングスタイルに関する公式なガイドラインです。PEP8には、インデントや行の最大長等のコーディングスタイルについても記載がありますが、本記事では特にPEP8の命名規則について整理してみました。
私自身もプログラムしていて命名規則どうだったかなと思うことがあるので、Pythonコーディングの際の参考としていただければ良いかなと思います。