This issue tracker has been migrated to GitHub, and is currently read-only.
For more information, see the GitHub FAQs in the Python's Developer Guide.

Author JEphron
Recipients JEphron
Date 2021-06-09.04:20:29
SpamBayes Score -1.0
Marked as misclassified Yes
Message-id <>
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):
    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):
    def _missing_(cls, value):
            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 this no longer works, instead producing:

TypeError: 'JobStatus': too many data types: [<class 'str'>, <class 'str'>]

The relevant change is

I believe that if we made `data_types` a set rather than a list then the example would become valid once again.
Date User Action Args
2021-06-09 04:20:29JEphronsetrecipients: + JEphron
2021-06-09 04:20:29JEphronsetmessageid: <>
2021-06-09 04:20:29JEphronlinkissue44356 messages
2021-06-09 04:20:29JEphroncreate