LoginSignup
1
2

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
1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2