IntEnumとFlag
整数型とフラグ型の列挙型を使用します
「IntEnumとFlag」はCoddyKit上の無料Python Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはPython Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Python Academyコースには全4レッスンが含まれています。
単純なEnumの先へ
enumモジュールには、用途に特化した基底クラスが用意されています。IntEnumのメンバーは整数のように動作し、Flagのメンバーはビット演算子で組み合わせられます。通常のEnumでは制限が多すぎる場合に利用できます。
通常のEnumはintではない
通常のEnumのメンバーは、対応する整数値と互換ではありません。数値と比較するとFalseになります。
from enum import Enum
class Level(Enum):
LOW = 1
HIGH = 2
print(Level.LOW == 1)IntEnumはintとして比較される
IntEnumのメンバーは整数そのものなので、対応する数値と等しいと判定され、順序付けもサポートします。
from enum import IntEnum
class Level(IntEnum):
LOW = 1
HIGH = 2
print(Level.LOW == 1)
print(Level.LOW < Level.HIGH)算術演算でのIntEnum
メンバーは実際の整数なので、計算やインデックス指定に使えます。値を数値処理のコードと連携させる必要がある場合に使用します。
from enum import IntEnum
class Priority(IntEnum):
LOW = 1
MEDIUM = 5
HIGH = 10
print(Priority.HIGH + 1)
print(Priority.MEDIUM * 2)IntEnumメンバーのソート
IntEnumは順序付けをサポートするため、メンバーのリストを追加のキー関数なしで値の順にソートできます。
from enum import IntEnum
class Priority(IntEnum):
LOW = 1
MEDIUM = 5
HIGH = 10
for p in sorted([Priority.HIGH, Priority.LOW, Priority.MEDIUM]):
print(p.name)組み合わせ可能なオプションにFlagを使う
Flag enumは、値を組み合わせて使うためのものです。各メンバーがそれぞれ独自のビットを占めるように、2の累乗を割り当てます。
from enum import Flag, auto
class Permission(Flag):
READ = auto()
WRITE = auto()
EXECUTE = auto()
print(Permission.READ)
print(Permission.READ.value)|によるFlagの組み合わせ
ビット単位のOR演算子|を使って、複数のFlagを1つの複合値にまとめます。
from enum import Flag, auto
class Permission(Flag):
READ = auto()
WRITE = auto()
EXECUTE = auto()
access = Permission.READ | Permission.WRITE
print(access)inによるメンバーシップの確認
in演算子を使ってFlagが設定されているか確認します。ビット単位のテストを自動的に実行してくれます。
from enum import Flag, auto
class Permission(Flag):
READ = auto()
WRITE = auto()
EXECUTE = auto()
access = Permission.READ | Permission.WRITE
print(Permission.READ in access)
print(Permission.EXECUTE in access)共通部分と削除
&(AND)でFlagを組み合わせると共通するビットを見つけられます。また、補数~との&を使ってFlagを削除できます。
from enum import Flag, auto
class Permission(Flag):
READ = auto()
WRITE = auto()
EXECUTE = auto()
access = Permission.READ | Permission.WRITE
still = access & ~Permission.WRITE
print(still)整数FlagにIntFlagを使う
IntFlagは両方の特性を組み合わせたものです。組み合わせ可能なFlagでありながら通常の整数のようにも動作するため、C APIや数値として保存されたビットマスクとの連携に便利です。
from enum import IntFlag, auto
class Mode(IntFlag):
R = 4
W = 2
X = 1
m = Mode.R | Mode.W
print(int(m))組み合わせたFlagの反復処理
組み合わせたFlagの値をループすると、その値に含まれる個々のFlagが得られます。アクティブなオプションを一覧表示する場合に便利です。
from enum import Flag, auto
class Permission(Flag):
READ = auto()
WRITE = auto()
EXECUTE = auto()
access = Permission.READ | Permission.EXECUTE
for p in access:
print(p.name)確認問題
通常のEnumではなくFlag enumを選ぶのはなぜですか。
まとめ
整数enumとFlag enumを学びました。
IntEnumのメンバーは整数のように動作し、順序付けと算術演算をサポートします。Flagのメンバーは|、&、~で組み合わせられ、inでテストできます。IntFlagは両方の動作を組み合わせます。- Flagの値には2の累乗を使います。
よくある質問
「IntEnumとFlag」レッスンは無料ですか?
はい。「IntEnumとFlag」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Python Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Python Academyコースには全4レッスンが含まれています。
「IntEnumとFlag」で何を学びますか?
整数型とフラグ型の列挙型を使用します ブラウザで直接実行するハンズオンコードでPython Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Python Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのPython Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。
「IntEnumとFlag」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このPython Academyレッスンでコードを書いて実行できますか?
はい。すべてのPython Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- Enumクラス
- IntEnumとFlag
- NamedTupleの基礎
- typing.NamedTuple