New submission from Jordan Ephron <[email protected]>:
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 <[email protected]>
<https://bugs.python.org/issue44356>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe:
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com