[Python-Dev] Enumeration items: `type(EnumClass.item) is EnumClass` ?

Guido van Rossum guido at python.org
Mon Apr 29 19:01:44 CEST 2013

On Mon, Apr 29, 2013 at 9:12 AM, Ethan Furman <ethan at stoneleaf.us> wrote:
> On 04/29/2013 08:39 AM, Guido van Rossum wrote:
>> Indeed, the "type(Color.red) is Color" claim was meant for the
>> situation where red is defined directly in Color, and I used type()
>> instead of isinstance() because Barry was proposing to overload
>> isinstance() to make this true without equating the classes. But for
>> the subclass case, I want MoreColor.red is Color.red and
>> isinstance(MoreColor.red, Color), but not isinstance(Color.red,
>> MoreColor). If you can't live with that, don't subclass enums.
> So if I understand:
> --> class Color(Enum):
> ...     red = 1
> ...     green = 2
> ...     blue = 3
> --> class MoreColor(Color):
> ...     cyan = 4
> ...     magenta = 5
> ...     yellow = 6
> --> type(MoreColor.red) is Color
> --> type(MoreColor.red) is not MoreColor
> In other words, while `red` is accessible in MoreColor, it's actually a
> Color instance?

Oh dear, this is actually a mess. I don't want MoreColor.red and
Color.red to be distinct objects, but then the isinstance() checks
will become confusing. If we don't override isinstance(), we'll get

  not isinstance(Color.red, MoreColor)
  isinstance(MoreColor.yellow, Color)

This would be pretty backwards.

I Ggoogled "enum subclassing" and found this StackOverflow article
explaining why you can't subclass enums in Java:
http://stackoverflow.com/questions/4604978/subclassing-an-enum which
refers to this more elaborate answer:

I think this conclusively shows that it's better to disallow
subclassing enums. (It also brings enum in line with bool, which is
also a "final" class.)

Adding Eli to the thread explicitly, because this needs to be
explained in the PEP.

--Guido van Rossum (python.org/~guido)

More information about the Python-Dev mailing list