eyecatch thumbnail

Python PEP8 命名規則

Profile picture
Takeru Yamada
2020.12.23

Contents


はじめに

どうも,たける@typememo です.

Python PEP8 命名規則についてです.


命名規則

実践されている命名規則はこんな感じらしい.

  • b (小文字1文字)
  • B (大文字1文字)
  • lowercase
  • lower_case_with_underscores
  • UPPERCASE
  • UPPER_CASE_WITH_UNDERSCORES
  • CapitalizedWords (CamelCase)
    e.g.) HttpServerError より HTTPServerError の方が良い.
  • mixedCase
  • Capitalized_Words_With_Underscores (醜いからやめた方がいい)
  • _single_leading_underscore (内部でだけ使う)
  • single_trailing_underscore_ (Python のキーワードとの衝突を回避)
  • __double_leading_underscore (クラスの属性に名前をつけるとき)
  • __double_leading_and_trailing_underscore__ (ユーザーが制御する名前空間に存在する “マジック”オブジェクト または “マジック”属性)

こんな名前は嫌だ

  • 単一の l (小文字のエル) O (大文字のオー) I (大文字のアイ) は 0 と 1 と区別がつかない

パッケージとモジュールの名前

  • モジュール: 全て小文字の短い名前,アンダースコア利用可能
  • パッケージ: 全て小文字の短い名前,アンダースコア利用非推奨

クラスの名前

  • クラス: CapWords 形式を使うべし

ただし,Python に組み込まれているクラスは単一の単語 (または2つの単語が混ざったもの) の命名規則に従っている. 例外的に CapWords 形式のクラスや変数もあるが.


型変数の名前

  • 型変数: CapWords 形式を使うべし,短い名前にすべし

共変や反変の振る舞いをする変数を宣言するときに _co_contra を変数末尾につけると良い.

from typing import TypeVar

VT_co = TypeVar('VT_co', covariant=True)
KT_contra = TypeVar('KT_contra', contravariant=True)

例外の名前

例外はクラスであるべきなので クラスの命名規則 を適用すると良い.

例外の名前の最後には Error をつけるべき.


グローバル変数の名前

(ここで言う “グローバル変数” は “モジュールレベルのグローバル変数” と言う意味)

(ここで示す規約は関数レベルのグローバル変数に対しても適応できる)

グローバル変数をエクスポートするのを防ぐために __all__ の仕組みを使う.

もしくは,エクスポートしたくないグローバル変数の頭に _ (アンダースコア) を付ける.


関数や変数の名前

関数の名前と変数の名前は全て小文字を使う.

必要に応じて単語をアンダースコアで区切るべし.

すでに mixedCase がすでに使われている場合は互換性を保つために mixedCase を使う.


関数やメソッドに渡す引数

インスタンスメソッドの第一引数の名前は 常に self を使う.

クラスメソッドの第一引数の名前は 常に cls を使う.

関数の引数名が python の予約語と衝突していたら末尾にアンダースコアを付ける.

e.g.) class_ は ok.短縮系の clss とかはやめた方がいい.


メソッド名とインスタンス変数

関数の命名規則と同じく,全て小文字を使い必要に応じてアンダースコアで区切るべし.

公開されていないメソッドやインスタンス変数にだけ,先頭にアンダースコアを付ける.

サブクラスと名前が衝突したら,先頭にアンダースコアを2つ付ける.


定数

定数はモジュールレベルで定義すること.

名前は全て大文字を使い,必要に応じてアンダースコアで区切る.


継承の設計

属性を公開するかどうかいつも決めるようにすべし.

よくわからないなら非公開にしておくべし.

属性 … クラスのメソッドやインスタンス変数

感想:

ちょっと,この “継承の設計” で展開されている話に全くついていけなかった. python をそんな使いこなしているわけではないから話についていけなかったのかな. そもそもクラスのこときちんと理解しているわけではないので, それも話についていけなかった理由の一つかな.


公開インタフェースと内部インタフェース

公開インタフェースは __all__ を使って全て宣言すること.

内部インタフェースは名前の前にアンダースコアを一つつけること.


おわりに

親ページに戻る

最後までお読みいただきありがとうございました.


愛用品


関連記事