Skip to content

Instantly share code, notes, and snippets.

@showa-yojyo
Created September 19, 2024 14:03
Show Gist options
  • Save showa-yojyo/2093ac38a55c3e1bce08b94444eaab8f to your computer and use it in GitHub Desktop.
Save showa-yojyo/2093ac38a55c3e1bce08b94444eaab8f to your computer and use it in GitHub Desktop.
title
ENUM How To ノート

自作列挙型定義の基本

  • Enum は組み込み型ではない。ゆえに from enum import Enum あるいはそれ相当 が必要。
  • サブクラス化してクラスフィールドを定義する。
  • メンバー識別子は大文字を使うことが強く勧められている。
  • 必要ならば、メンバーの値を参照することが可能。
    • MyEnum.MY_MEMBER
    • MyEnum(value_of_my_member)
  • メンバーには repr() が効く。
  • 注意:メンバーの型はそれが所属する列挙型に等しい。
  • メンバーには属性 .name があり、識別子として与えた文字列自体を返す。
  • メンバーには属性 .value があり、定義時に与えた値を返す。
  • 自作列挙型にはクラスメソッドを追加可能。
  • Enum ではなく Flag を採用すると、ビットフィールド指向列挙型を実現可能。
  • メンバーの実際の値が重要でない場合は、手間を省いて値に enum.auto() を使用 可能。

以上が basic な事項とのこと。

応用テク

  • my_enum[name_of_my_member] でも値を得られる。
  • 列挙型は同じ値の別名として複数の名前を許可する。これを望まぬ場合は @unique decorator を自作列挙型自体に使用する。
  • list(MyEnum), MyEnum.__members__
  • Color.BLUE == 2 のような比較は False になる。
  • 列挙型のサブクラス化は、その列挙型がメンバーを定義していない場合にのみ許され る(つまり、普通はサブクラスを定義できない)。
  • 列挙型は dump, load が対応する。ただし「落とし穴」がある。
  • namedtuple 方式の構築も可能。E.g. Color = Enum('Color', 'RED GREEN BLUE').
  • 既定の開始番号が 0 ではなく 1 である理由は、0 はブーリアン的には False だが、 列挙型のメンバーはすべて True と既定では評価されるからだ。
  • Enum の変種たち:
    • IntEnum: 先ほどの比較が自然に可能になる列挙型。いくつかの操作において int 型との互換性がある。
    • StrEnum: 文字列型ベースの列挙型。いくつかの操作において str 型との互換性 がある。
    • IntFlag, Flag: ビットフィールド指向にした列挙型。ビット演算子可。
  • 注意:EnumFlag を選ぶほうがより望ましい。

ここまでが advanced 事項の前半部ノート。上記文書を読んで知ったが、cardinal directions は東西南北か。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment