検索
連載

[解決!Python]PEP 8の命名規則まとめ解決!Python

Pythonコードを書くときに変数や関数、クラスなどの名前はどのように付けたらよいだろう。PEP 8で述べられているその基本をまとめた。

PC用表示 関連情報
Share
Tweet
LINE
Hatena
「解決!Python」のインデックス

連載目次

種類 命名規約
モジュール名 全て英小文字
可読性が高まるのならアンダースコア「_」を使ってもよい
パッケージ名 全て英小文字
アンダースコアの使用は推奨されない
クラス名 キャメルケース(CamelCase)
クラスの主な用途が呼び出し可能オブジェクトであり(「クラス名()」のように呼び出し可能とする)、インタフェースのドキュメントが整備されているときには関数名と同じ命名規約を使ってもよい
型変数名 キャメルケースでなるべく短い名前がよい。共変性があるときには末尾に「_co」を、反変性があるときには末尾に「_contra」を付加することが推奨される
例外名(例外クラス名) クラス名と同じ命名規約となるが、例外名の最後に「Error」を付加すべき(その例外が実際にエラーである場合)
関数名 全て英小文字。可読性が高まるのであれば、単語と単語はアンダースコア「_」で区切る
グローバル変数名 関数名と同じ
ローカル変数名 関数名と同じ
関数やメソッドの引数名 インスタンスメソッドの第1引数の名前には常にselfを使用する
クラスメソッドの第1引数の名前委には常にclsを使用する
引数名が予約語と衝突するときには、省略した語を使うよりも末尾にアンダースコアを1つ追加するのが一般にはよい(clssよりもclass_の方がよい)
メソッド名/インスタンス変数名 関数名と同じ
パブリックではないメソッドとインスタンス変数の名前にはアンダースコアを1つ前置する
派生クラスでの名前の衝突を避けるには、2個のアンダースコア「__」を前置する。これによりPythonの名前マングリングが行われる
定数名 通常はモジュールのトップレベルで定義する
全て大文字で単語間はアンダースコアで区切る
Pythonではこのようにして定義した定数は代入可能であることには注意
PEP 8で示されている命名規約(一部)

PEP 8に示されている命名規約

 PEP 8はPythonコードを記述する際のコーディングスタイルの基本的なガイドラインを示すものだ。この中では変数や関数、クラスなどの名前を付ける際にもどのようにすべきが示されている。

 使用すべきではない1文字の名前として、PEP 8では「l」(小文字のエル)、「O」(大文字のオー)、「I」(大文字のアイ)が挙げられている。使用している環境のフォント設定によっては、これらは数字の「0」「1」と見分けが付きにくくなるからだ。また、PEP 8では標準ライブラリで使用される識別子はASCIIと互換性があるものにしなければならないとあるが、自分でコードを書く際にもこれに準拠するのがよいだろう。

 PEP 8に示されている命名規約を表にまとめたのが上に掲載した表だ。

 表にするとたくさんの命名規約があるように思えるかもしれないが、基本的にはクラス名(例外クラス名)はキャメルケース(単語の先頭だけを大文字に、残りを小文字にして単語と単語は区切り文字なしで連続させる)を使い、その他の場面では英小文字とアンダースコアの組み合わせを使用するのが大方針といえる(ただし、パッケージ名は英小文字のみとするのがよい)。定数については大文字とアンダースコアの組み合わせた名前を付けることで「これは定数である」と表明できるが、実際には代入可能なことは覚えておこう。

 加えて覚えておきたいのはクラスの属性として他に公開したくないものがある場合だ。このときには、名前を1個のアンダースコア「_」または2個のアンダースコア「__」で始める。前者はコードを書いた側から、コードを利用する側への「この属性(インスタンス変数やメソッドなど)は内部で使用するもの」であることの表明であり、実際にはコードの利用する側はそれらを自由に使用できてしまう。

class Foo:
    def __init__(self):
        self._name = 'hogehoge'

f = Foo()
print(f._name)  # OK


 これに対して、2個のアンダースコア「__」で名前を始めると、Pythonの名前マングリング機構が働いて、その名前では属性にアクセスできなくなる。

class Foo:
    def __init__(self):
        self.__name = 'hogehoge'

f = Foo()
print(f.__name)  # AttributeError


 名前マングリング機構で名前がどのように変形されるかを知っていれば、この仕組みを回避して属性にアクセスは可能だが、1個のアンダースコアで名前を始めるよりも強い形で属性がプライベートであることを表明するのに役立つはずだ。

 モジュールのトップレベルで関数を定義する際にもアンダースコアは意味を持つ。「from some_module import *」形式でインポートを行おうとするときに、それらはインポートされないようになるのだ。モジュール内部で使用することを念頭に置いた関数などはアンダースコアで名前を始めるようにしよう。

 アンダースコアを名前の最後に付加する場合もある。関数やメソッドの引数などで使いたい名前が既にPythonの予約語として使われている場合に、名前の衝突を避けるときにそのような使い方をする。

 例えば、クラスオブジェクトを受け取り、そのクラスを使って何かの作業を行う関数があったとする。このときには、引数名は「clss」などの省略語よりもアンダースコアを末尾に足した「class_」とすることがよいとされている(ただし、同義語を用いて衝突を避けるのがもっとよい)。

def do_some_work(class_):
    # class_を使って何かをする
    pass


 最後に、表にはまとめなかったが特殊メソッドは2つのアンダースコアで始まり、2つのアンダースコアで終わる。これらはPythonの多態性(ポリモーフィズム)を支えるためにシステムと強く密着しているので、自作のメソッドにそうした名前を付けるのはやめた方がよい。

「解決!Python」のインデックス

解決!Python

Copyright© Digital Advantage Corp. All Rights Reserved.

[an error occurred while processing this directive]
ページトップに戻る