Categories: Python

【Python】Flagクラスを使ったフラグ管理の方法

この記事では、Pythonでフラグ(flag)を使う方法を解説します。

enumモジュールのFlagクラスを使うことで簡単にフラグを管理することができます。

例えば、リストを使ってフラグを管理すると以下のような感じになります。

flags = [True, True, False]

if flags[0] == True:
    print('flag1')
if flags[1] == True:
    print('flag2')
if flags[2] == True:
    print('flag3')

実行結果

flag1
flag2

配列を使った場合では、どの要素がなんのフラグを管理しているかわかりずらい。また、フラグを途中に追加した場合、インデックスをいちいちずらす必要がある。

フラグを使うことで以下のように管理できる。

from enum import Flag, auto

# フラグ定義
class Flags(Flag):
    flag1 = auto()
    flag2 = auto()
    flag3 = auto()

flags = Flags.flag1

# フラグ追加
flags |= Flags.flag2

# フラグ判定
if Flags.flag1 in flags:
    print('flag1')
if Flags.flag2 in flags:
    print('flag2')
if Flags.flag3 in flags:
    print('flag3')

実行結果

flag1
flag2

Flagクラスを使った場合では、フラグを名前で管理できるのでわかりやすく、インデックスを使わないので新たなフラグを追加したい場合も簡単です。

それでは、フラグの使い方を見ていきましょう。

フラグはPython 3.6から追加されました

フラグの定義

フラグはenumモジュールのFlagクラスを継承させて定義します。

from enum import Flag

class クラス名(Flag):
    name = value
    name = value
    name = value

nameにフラグメンバー名、valueに値を指定しますが、特別な理由がない限りauto()を指定すれば問題ありません。

from enum import Flag, auto

class クラス名(Flag):
    name1 = auto()
    name2 = auto()
    name3 = auto()

サンプル

適当に簡単なフラグを定義してみます。

from enum import Flag, auto

class Flags(Flag):
    flag1 = auto()
    flag2 = auto()
    flag3 = auto()

flags = Flags.flag1
print(flags)

実行結果

Flags.flag1

フラグの演算

フラグはビット演算子をサポートしています。

論理和(or)

|演算子を使うことでフラグを追加することができる。

flags = Flags.flag1 | Flags.flag2
print(flags)

実行結果

Flags.flag2|flag1

論理積(and)

&演算子を使うことで共通しているフラグのみを取得することができる。

flags1 = Flags.flag1 | Flags.flag2 |  Flags.flag3
flags2 = Flags.flag1 | Flags.flag2
print(flags1 & flags2)

実行結果

Flags.flag2|flag1

排他的論理和(xor)

^演算子を使うことで共通していないフラグのみを取得できる。

flags1 = Flags.flag1 | Flags.flag2 |  Flags.flag3
flags2 = Flags.flag1 | Flags.flag2
print(flags1 ^ flags2)

実行結果

Flags.flag3

反転

フラグに単行演算子である~を付けることで自身以外の全てのフラグを取得できる。

flags = Flags.flag1 | Flags.flag2 
print(~flags)

flags = Flags.flag1
print(~flags)

実行結果

Flags.flag3
Flags.flag3|flag2

フラグの判定

フラグを判定するにはin演算子を使います。

flags = Flags.flag1

# フラグ判定
if Flags.flag1 in flags:
    print('flag1')
if Flags.flag2 in flags:
    print('flag2')
if Flags.flag3 in flags:
    print('flag3')

実行結果

flag1

フラグを追加しても1つのフラグと判定することができる。

flags = Flags.flag1 | Flags.flag2 | Flags.flag3

# フラグ判定
if Flags.flag1 in flags:
    print('flag1')
if Flags.flag2 in flags:
    print('flag2')
if Flags.flag3 in flags:
    print('flag3')

実行結果

flag1
flag2
flag3

フラグが全く同じ時のみ処理したい場合は、==isを使う。

flags = Flags.flag1 | Flags.flag2

# フラグ判定
if Flags.flag1 is flags:
    print('flag1')
if Flags.flag2 is flags:
    print('flag2')
if Flags.flag3 is flags:
    print('flag3')

if Flags.flag1 | Flags.flag2 is flags:
    print('flag1 | flag2')

実行結果

flag1 | flag2

まとめ

この記事では、Pythonでフラグを扱う方法を解説しました。

リストや辞書などのコレクションを使うよりも高速で扱うことができます。また、ビット演算により判定が簡単にできます。

それでは今回の内容はここまでです。ではまたどこかで〜( ・∀・)ノ

ゆうまる

独学でプログラミングを勉強しているおじさん。いろんな言語を勉強したが浅く広くなためあまり仕事につながらない。また忘れっぽいため自分のブログを備忘録としても使っている。産まれてこのかたずっとネコを飼ってる生粋のネコ派。最近お腹が出てきて筋トレに奮闘中!

Recent Posts

【Dart】コンストラクタのデフォルト引数について

Dartのコンストラクタのデフォルト引数…

2週間 ago

【Unity】有料アセットを無料で手に入れる方法

この記事では、Unityの有料アセットを…

4か月 ago

【Python】任意の秒数だけ処理を一時停止する方法【sleep()関数】

この記事では、Pythonで任意の秒数だ…

1年 ago

【Python】Wordの文書の新規作成と読み書き

この記事では、Pythonを使ってWor…

1年 ago

【Python】メタクラスって結局なんなの?

この記事では、Pythonのメタクラスに…

1年 ago