PythonでEnumを使うときの変数名の記法についてルールがあるのか気になったので調べてみた。
PEP8
PEP8には「Enumを書くときはxxxケースで書きなさい」ということは特に明記されていない。
※ PEP8の方が、EnumがPythonに入った時期よりも、もちろん古いので当然という気もする。
ただ、定数は全て大文字かつ区切り文字はアンダースコアで定義すべきということは記載されている。
Constants are usually defined on a module level and written in all capital letters with underscores separating words. Examples include MAX_OVERFLOW and TOTAL.
www.python.org
※ 「全て大文字かつ区切り文字はアンダースコア」のことを「アッパースネークケース」もしくは「コンスタンツケース」と呼ぶらしい。
e-words.jp
PEP435
Enumが提案されたのはPEP435とのことだが、PEP435に記載されているサンプルコードは
- クラス名: アッパーキャメルケース
- フィールド名: スネークケース
となっている。
from enum import Enum class Color(Enum): red = 1 green = 2 blue = 3
※ 先頭が大文字のキャメルケースのことを「アッパーキャメルケース」もしくは「パスカルケース」と呼ぶらしい。
ja.wikipedia.org
最新の公式ドキュメント
最新の公式ドキュメント(2021/10時点)をみると、サンプルコードは
- クラス名: キャメルケース
- フィールド名: アッパースネークケース
となっている。
class Color(Enum): RED = 1 GREEN = 2 BLUE = 3
Pythonの標準モジュールでEnumが使われている箇所
例えばPythonの標準のhttp
モジュールではステータスコードの定義にEnumが使われているが、記法を確認してみたところ、やはり
- クラス名: キャメルケース
- フィールド名: アッパースネークケース
となっていた。
from enum import IntEnum, _simple_enum ... @_simple_enum(IntEnum) class HTTPStatus: ... BAD_REQUEST = (400, 'Bad Request', 'Bad request syntax or unsupported method') UNAUTHORIZED = (401, 'Unauthorized', 'No permission -- see authorization schemes') ...
結論
以上の調査結果より、
- クラス名: キャメルケース
- フィールド名: アッパースネークケース
で定義するのがよいということでよさそう。
何でPEP435の時点では、フィールド名が小文字だったのに、公式ドキュメントのサンプルコードの時点では大文字になったのか経緯は分からなかった。
ただ、Enumは定数を定義するときに使うものなので、大文字の方が「定数はアッパースネークケースで定義するべき」というPEP8の方針にも合うので違和感がないと思う。