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
: ビットフィールド指向にした列挙型。ビット演算子可。
- 注意:
Enum
とFlag
を選ぶほうがより望ましい。
ここまでが advanced 事項の前半部ノート。上記文書を読んで知ったが、cardinal directions は東西南北か。