この記事では、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
クラスを使った場合では、フラグを名前で管理できるのでわかりやすく、インデックスを使わないので新たなフラグを追加したい場合も簡単です。
それでは、フラグの使い方を見ていきましょう。
フラグの定義
フラグは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でフラグを扱う方法を解説しました。
リストや辞書などのコレクションを使うよりも高速で扱うことができます。また、ビット演算により判定が簡単にできます。
それでは今回の内容はここまでです。ではまたどこかで〜( ・∀・)ノ