ページへ戻る
印刷
Python/列挙型
をテンプレートにして作成 ::
NJF Wiki
xpwiki
:Python/列挙型 をテンプレートにして作成
開始行:
*基本
Pythonの列挙型enumは何かひとまとまりの定数を定義するとき...
例えば、ゲームのプログラムで今どの画面かを識別するために...
SCREEN_TITLE = 1 #タイトル画面
SCREEN_PLAYING = 2 #プレイ中画面
SCREEN_GAME_OVER = 3 #ゲームオーバー画面
SCREEN_TRANSITION = 4 #画面遷移中
このままでもプログラムできますが、もう少しまとめてあつか...
また、ただの変数なのでうっかり書きかえないかも心配です。
これをenumを使えば、以下のように書き直せます。
from enum import Enum
class Screen(Enum):
TITLE = 1
PLAYING = 2
GAME_OVER = 3
TRANSITION = 4
使う時は
Screen.PLAYING
などとすれば参照できます。
比較するときはメンバー同士で行う必要があります。
print(Screen.TITLE == 1)
print(Screen.TITLE == Screen.TITLE)
結果:
False
True
Enumは他の型の値と直接比較できないので注意してください。
めんどうなようですが、こうなっているとせっかく定義したEnu...
必要であれば、後述のIntEum型なら整数との比較が可能です。
この記事では数値で定義しましたが、文字列で定義することも...
また、これらは実質定数として扱えます。
例えば、
Screen.GAME_OVER = 2
とすると
Traceback (most recent call last):
File "enumtest.py", line 10, in <module>
Screen.GAME_OVER = 2
File "/usr/lib/python3.6/enum.py", line 363, in __seta...
raise AttributeError('Cannot reassign members.')
AttributeError: Cannot reassign members.
というような実行時エラーが出ます。
また、
screen = Screen.PLAYING
print(screen)
とすると、
Screen.PLAYING
とクラスとメンバー名が出力されるのでデバッグの時にわかり...
nameとvalueというプロパティを使えばメンバー名と値も参照で...
print(Screen.GAME_OVER.name,Screen.GAME_OVER.value)
結果:
GAME_OVER 4
ループ処理もできます。
このとき、順番は定義順であることが保証されています。
for s in Screen:
print(s)
結果:
Screen.TITLE
Screen.PLAYING
Screen.GAME_OVER
Screen.TRANSITION
となります。
このようにenumを使うと定数をまとめてあつかいやすくなりま...
さらに以下のような便利な機能があります。
*auto
Python3.6から自動で番号をつけてくれるautoという関数が加わ...
from enum import Enum, auto
class Screen(Enum):
TITLE = auto()
PLAYING = auto()
GAME_OVER = auto()
TRANSITION = auto()
とすれば自動で番号をつけてくれます。
例えば上の例でタイトル画面の前にというロード画面を付け加...
class Screen(Enum):
LOADING = 1
TITLE = 2 #ここから下全て1ずらした
PLAYING = 3
GAME_OVER = 4
TRANSITION = 5
enumのメンバー数が多いと編集が大変になります。
autoを使っておけば自動で番号をつけてくれるので「LOADING =...
class Screen(Enum):
LOADING = auto() #この行だけ増やした
TITLE = auto()
PLAYING = auto()
GAME_OVER = auto()
TRANSITION = auto()
また、enum型は値が一意になる事は保証していません。
次のようなコードは問題なく実行されます。
class Test(Enum):
TEST1 = 1
TEST2 = 1
TEST3 = 1
しかし、実際には一意な値をつけたいときが多いでしょう。
手で定義するとどうしても書き間違いの可能性が出てきます。
その時は「@unique」というデコレータを使えば一意であること...
@unique
class Test(Enum):
TEST1 = 1
TEST2 = 1
TEST3 = 1
とすると、実行時エラーになります。
しかし、autoを使っておけば、自動的に値は一意になります。
とりあえず値はなんでもいいという場合にはautoを使うのがお...
autoを使いつつ、特定の値を同じにしたければ以下のようにし...
class Test(Enum):
TEST1 = auto()
TEST2 = auto()
TEST3 = auto()
TEST2_ALT = TEST2
print(Test.TEST2_ALT,Test.TEST2_ALT.value)
結果:
Test.TEST2 2
*派生列挙型
**IntEnum
Enumとほぼ同じですが、整数や他のIntEnum型との直接の比較が...
ほとんどの場合Enumで十分ですが、外部から入力された値に名...
**IntFlagとFlag
Enumにビット演算子を適用可能にしてフラグとして使いやすく...
ここに書くと長くなるのでページを分けて[[Python/FlagとIntF...
*まとめ
列挙型は使わないでもプログラムは書けますし、実際Python3.4...
しかし、覚えておくといろいろ便利に使えます。
特に状態遷移などがあり多くの定数が必要なプログラムを書く...
終了行:
*基本
Pythonの列挙型enumは何かひとまとまりの定数を定義するとき...
例えば、ゲームのプログラムで今どの画面かを識別するために...
SCREEN_TITLE = 1 #タイトル画面
SCREEN_PLAYING = 2 #プレイ中画面
SCREEN_GAME_OVER = 3 #ゲームオーバー画面
SCREEN_TRANSITION = 4 #画面遷移中
このままでもプログラムできますが、もう少しまとめてあつか...
また、ただの変数なのでうっかり書きかえないかも心配です。
これをenumを使えば、以下のように書き直せます。
from enum import Enum
class Screen(Enum):
TITLE = 1
PLAYING = 2
GAME_OVER = 3
TRANSITION = 4
使う時は
Screen.PLAYING
などとすれば参照できます。
比較するときはメンバー同士で行う必要があります。
print(Screen.TITLE == 1)
print(Screen.TITLE == Screen.TITLE)
結果:
False
True
Enumは他の型の値と直接比較できないので注意してください。
めんどうなようですが、こうなっているとせっかく定義したEnu...
必要であれば、後述のIntEum型なら整数との比較が可能です。
この記事では数値で定義しましたが、文字列で定義することも...
また、これらは実質定数として扱えます。
例えば、
Screen.GAME_OVER = 2
とすると
Traceback (most recent call last):
File "enumtest.py", line 10, in <module>
Screen.GAME_OVER = 2
File "/usr/lib/python3.6/enum.py", line 363, in __seta...
raise AttributeError('Cannot reassign members.')
AttributeError: Cannot reassign members.
というような実行時エラーが出ます。
また、
screen = Screen.PLAYING
print(screen)
とすると、
Screen.PLAYING
とクラスとメンバー名が出力されるのでデバッグの時にわかり...
nameとvalueというプロパティを使えばメンバー名と値も参照で...
print(Screen.GAME_OVER.name,Screen.GAME_OVER.value)
結果:
GAME_OVER 4
ループ処理もできます。
このとき、順番は定義順であることが保証されています。
for s in Screen:
print(s)
結果:
Screen.TITLE
Screen.PLAYING
Screen.GAME_OVER
Screen.TRANSITION
となります。
このようにenumを使うと定数をまとめてあつかいやすくなりま...
さらに以下のような便利な機能があります。
*auto
Python3.6から自動で番号をつけてくれるautoという関数が加わ...
from enum import Enum, auto
class Screen(Enum):
TITLE = auto()
PLAYING = auto()
GAME_OVER = auto()
TRANSITION = auto()
とすれば自動で番号をつけてくれます。
例えば上の例でタイトル画面の前にというロード画面を付け加...
class Screen(Enum):
LOADING = 1
TITLE = 2 #ここから下全て1ずらした
PLAYING = 3
GAME_OVER = 4
TRANSITION = 5
enumのメンバー数が多いと編集が大変になります。
autoを使っておけば自動で番号をつけてくれるので「LOADING =...
class Screen(Enum):
LOADING = auto() #この行だけ増やした
TITLE = auto()
PLAYING = auto()
GAME_OVER = auto()
TRANSITION = auto()
また、enum型は値が一意になる事は保証していません。
次のようなコードは問題なく実行されます。
class Test(Enum):
TEST1 = 1
TEST2 = 1
TEST3 = 1
しかし、実際には一意な値をつけたいときが多いでしょう。
手で定義するとどうしても書き間違いの可能性が出てきます。
その時は「@unique」というデコレータを使えば一意であること...
@unique
class Test(Enum):
TEST1 = 1
TEST2 = 1
TEST3 = 1
とすると、実行時エラーになります。
しかし、autoを使っておけば、自動的に値は一意になります。
とりあえず値はなんでもいいという場合にはautoを使うのがお...
autoを使いつつ、特定の値を同じにしたければ以下のようにし...
class Test(Enum):
TEST1 = auto()
TEST2 = auto()
TEST3 = auto()
TEST2_ALT = TEST2
print(Test.TEST2_ALT,Test.TEST2_ALT.value)
結果:
Test.TEST2 2
*派生列挙型
**IntEnum
Enumとほぼ同じですが、整数や他のIntEnum型との直接の比較が...
ほとんどの場合Enumで十分ですが、外部から入力された値に名...
**IntFlagとFlag
Enumにビット演算子を適用可能にしてフラグとして使いやすく...
ここに書くと長くなるのでページを分けて[[Python/FlagとIntF...
*まとめ
列挙型は使わないでもプログラムは書けますし、実際Python3.4...
しかし、覚えておくといろいろ便利に使えます。
特に状態遷移などがあり多くの定数が必要なプログラムを書く...
ページ名: