動機
- カラム名がvscodeで補完できなくてつらい
- Enum にするなら同じ文字列は繰り返したくない
from __future__ import annotations
from enum import auto, Enum, unique
class StringEnum(str, Enum):
"""文字列の列挙型
Note
----
3.11 で追加された `StrEnum` は `auto()` で `str.lower()` を呼び出すが、
このクラスはそのままの名前を返す
"""
def _generate_next_value_(name, start, count, last_values):
return name
def __str__(self):
return self.value
@classmethod
def values(cls) -> list[str]:
return [str(i) for i in cls]
つかいかた
import pandas as pd
@unique
class Columns(StringEnum):
Spam = auto()
Ham = auto()
Egg = auto()
Unchi = "💩"
pd.DataFrame(columns=Columns.values())
# Empty DataFrame
# Columns: [Spam, Ham, Egg, 💩]
# Index: []
NOTE
pd.DataFrame(columns=Columns)
でも動くが2023-03-03現在の型定義ではPylanceがエラーを吐くので.values()
経由
collections.abc.Collection[str]
とは互換するけど list[str]
とは互換しない