Ryota Kondo

Ryota Kondo

2023/11/25

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'>

関連タグの記事

Ryota Kondo
Ryota Kondo

システムエンジニア・プログラマー|このブログサイトの運営もしており、思いついたことをまとめて記事を書いています💡|Twitterのフォローはお気軽に