import enum class StrEnum(str, enum.Enum): """ Enum where members are also (and must be) strings (backported from Python 3.11). """ def __new__(cls, *values: str) -> "StrEnum": "values must already be of type `str`" if len(values) > 3: raise TypeError('too many arguments for str(): %r' % (values, )) if len(values) == 1: # it must be a string if not isinstance(values[0], str): # type: ignore raise TypeError('%r is not a string' % (values[0], )) if len(values) >= 2: # check that encoding argument is a string if not isinstance(values[1], str): # type: ignore raise TypeError('encoding must be a string, not %r' % (values[1], )) if len(values) == 3: # check that errors argument is a string if not isinstance(values[2], str): # type: ignore raise TypeError('errors must be a string, not %r' % (values[2])) value = str(*values) member = str.__new__(cls, value) member._value_ = value return member @staticmethod def _generate_next_value_(name: str, start: int, count: int, last_values: list[str]) -> str: """ Return the lower-cased version of the member name. """ return name.lower()