Python|テーブル、CSVなどの列定義でStrEnumを使った時のメリット
Python 3.11で追加されたenum.StrEnumをテーブル、CSVなどの列定義時に使うといろいろメリットがありましたので、今回はそれについて説明したいと思います。
enum.StrEnumの特徴
StrEnumはenumの一種ですが、enumと違ってvalueに設定した文字列としてメンバーを利用することができます。
簡単に言うとメンバーのvalueに設定した文字列を使う場合は、通常のenumの場合はEnumClass.メンバー.value
ですが、StrEnumの場合はEnumClass.メンバー
となります。つまり、文字列として使うのみであれば、StrEnumだとコード量が少なくて済みます。
StrEnumのメンバーはほとんどの場合は文字列として利用できます。例外として例えばtypeはstrではなくenumのメンバーになります。
enum.StrEnumテーブル、CSVなどの列定義で使うメリット
StrEnumの特徴からテーブル、CSVなどの列定義で使うと下のようなメリットがあります。
- メンバーのユニーク性を担保できる。さらに
@unique
を使うとvalueのユニーク性も担保できる。 - メンバーをループさせられるので、全列の取得処理が簡単に記載できる。
- 通常のenumと違って、定義利用時にコード量が少なくて済む。
コードのイメージは下の通りです。
### 定義サンプル ###
from enum import StrEnum, unique
@unique # valueのユニーク性を担保(ユニークでないと実行時にエラー)
class CustomerCol(StrEnum):
"""カスタマーテーブル列定義"""
ID = "id"
NAME = "name"
EMAIL = "email"
CREATE_DATE = "create_date"
@classmethod
def get_columns(cls):
"""全列のlistを返却する"""
return [member.value for member in cls] # メンバーをループできる
### 定義を使った処理のサンプル ###
import pandas as pd
customer = pd.DataFrame(
[
[1, "Sato", "xxx@sample.com", ""],
[2, "Suzuki", "yyy@sample.com", ""],
[3, "Takahashi", "zzz@sample.com", ""],
],
columns=CustomerCol.get_columns(),
)
customer[CustomerCol.CREATE_DATE] = "2023/11/25" # いちいちvalueをつけなくてよい
print(customer)
# id name email create_date
# 0 1 Sato xxx@sample.com 2023/11/25
# 1 2 Suzuki yyy@sample.com 2023/11/25
# 2 3 Takahashi zzz@sample.com 2023/11/25
### typeはstrではないので注意 ###
print(type(CustomerCol.ID))
# <enum 'CustomerCol'>