Enumの基本的な使い方
Enumの基本的な使い方について復習しておきます。
enum(列挙型)を定義するにはEnumをimportする必要があります。
次にクラスにEnumを継承するのが基本的な流れです。
from enum import Enum
# enumの定義
class ErrorCodes(Enum):
SUCCESS = 0
ERROR = 1
if __name__ == "__main__":
code = ErrorCodes.SUCCESS
print(f"type: {type(code)}")
print(f"code: {code}")
if code == ErrorCodes.SUCCESS:
print("Success")
else:
print("Error")
実行結果
type: <enum 'ErrorCodes'>
code: ErrorCodes.SUCCESS
Success
code
にアクセスするとSUCCESS
が得られます。
しかし、せっかく番号をつけてるのにSUCCESS
をもらっても使いにくいですよね。
そんなときはIntEnum
を使いましょう。
これによりアクセスしたときに数値が得られます。
- from enum import Enum
+ from enum import IntEnum
- class ErrorCodes(Enum):
+ class ErrorCodes(IntEnum):
SUCCESS = 0
ERROR = 1
if __name__ == "__main__":
code = ErrorCodes.SUCCESS
print(f"type: {type(code)}")
print(f"code: {code}")
- if code == ErrorCodes.SUCCESS:
+ if code == 0:
print("Success")
else:
print("Error")
実行結果
type: <enum 'ErrorCodes'>
code: 0
Success
ここからpython 11の新機能
とりあえず、使い方を少し復習したことろで、新機能をご紹介します。
@enum.global_enum
公式ドキュメント見てたら見つけました。
global_enum は C言語の無名列挙型 (unnamed enumration)みたいな使い方ができます。バグなのかは分かりませんが別ファイルから作成したenumをimportするとglobal_enumの機能が無効になってしまうようです。
また、Pylanceなどからは"TOKEN_NUMBER" が定義されていません
とか怒られますが使えます。そのうち対応されるでしょう。
from enum import IntEnum, global_enum
@global_enum
class TokenType(IntEnum):
TOKEN_NUMBER = 0
TOKEN_STRING = 1
TOKEN_IDENTIFIER = 2
print(TOKEN_NUMBER)
print(TOKEN_STRING)
print(TOKEN_IDENTIFIER)
実行結果
0
1
2