delhi09の勉強日記

技術トピック専用のブログです。自分用のメモ書きの投稿が多いです。あくまで「勉強日記」なので記事の内容は鵜呑みにしないでください。

PythonでEnumを使うときの変数名の記法について

PythonEnumを使うときの変数名の記法についてルールがあるのか気になったので調べてみた。

PEP8

PEP8には「Enumを書くときはxxxケースで書きなさい」ということは特に明記されていない。
※ PEP8の方が、EnumPythonに入った時期よりも、もちろん古いので当然という気もする。

ただ、定数は全て大文字かつ区切り文字はアンダースコアで定義すべきということは記載されている。

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

www.python.org

※ 先頭が大文字のキャメルケースのことを「アッパーキャメルケース」もしくは「パスカルケース」と呼ぶらしい。
ja.wikipedia.org

最新の公式ドキュメント

最新の公式ドキュメント(2021/10時点)をみると、サンプルコードは

  • クラス名: キャメルケース
  • フィールド名: アッパースネークケース

となっている。

docs.python.org

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')
    ...

github.com

結論

以上の調査結果より、

  • クラス名: キャメルケース
  • フィールド名: アッパースネークケース

で定義するのがよいということでよさそう。

何でPEP435の時点では、フィールド名が小文字だったのに、公式ドキュメントのサンプルコードの時点では大文字になったのか経緯は分からなかった。

ただ、Enumは定数を定義するときに使うものなので、大文字の方が「定数はアッパースネークケースで定義するべき」というPEP8の方針にも合うので違和感がないと思う。