New submission from Jordan Ephron <j...@jephron.com>:
Prior to 3.8 it was possible to create "abstract" enums (without members) and mix them together. To motivate with an example, perhaps we're modeling an API and want to be robust in the face of inconsistent casing class CaseInsensitiveStrEnum(str, Enum): @classmethod def _missing_(cls, value): for member in cls._member_map_.values(): if member._value_.lower() == value.lower(): return member return super()._missing_(value) and perhaps we also want to be robust in response to extensibility class LenientStrEnum(str, Enum): @classmethod def _missing_(cls, value): logger.warning( f"[{cls.__name__}] encountered an unknown value!\n" f"Luckily I'm a LenientStrEnum, so I won't crash just yet.\n" f"You might want to add a new case though.\n" f"Value was: '{value}'" ) return UnexpectedStr(value) but we also want to model some known good set of values, so mixing together the abstract enums we'd get something like class JobStatus(CaseInsensitiveStrEnum, LenientStrEnum): ACTIVE = "active" PENDING = "pending" TERMINATED = "terminated" However, due to the resolution of https://bugs.python.org/issue39587 this no longer works, instead producing: TypeError: 'JobStatus': too many data types: [<class 'str'>, <class 'str'>] The relevant change is https://github.com/ethanfurman/cpython/commit/bff01f3a3aac0c15fe8fbe8b2f561f7927d117a1 I believe that if we made `data_types` a set rather than a list then the example would become valid once again. ---------- messages: 395378 nosy: JEphron priority: normal severity: normal status: open title: Abstract enum mixins not allowed type: behavior versions: Python 3.8, Python 3.9 _______________________________________ Python tracker <rep...@bugs.python.org> <https://bugs.python.org/issue44356> _______________________________________ _______________________________________________ Python-bugs-list mailing list Unsubscribe: https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com