New submission from Nick Coghlan:

Guido chose to follow Java in enforcing the invariant "Enum members are 
instances of that Enum" for PEP 435 (i.e. "assert (all(isinstance(x, SomeEnum) 
for x in SomeEnum)"). As a consequence, the Enum metaclass prevents subclassing 
of Enums with defined members.

This is a reasonable design choice, but one that limits the applicability of 
the standard library enum solution for use cases that currently rely on this 
feature of a custom enum implementation (including flufl.enum, the original 
inspiration for this feature).

An alternative reasonable design choice is to allow extension of enumerations 
(similar to flufl.enum) and relax the invariant to "Enum members are an 
instance of that Enum or an Enum-derived parent class of that Enum" (i.e. 
"assert (all(issubclass(type(x), Enum) and type(x) in SomeEnum.mro() for x in 
SomeEnum)")

There is no need to support this directly in the standard library, but it would 
be valuable to make it straightforward to support in an Enum variant by 
subclassing the standard metaclass (similar to the customisation mechanisms 
provided to support things like autonumbered enums through a derived 
metaclass). Currently, implementing this behaviour involves overriding a 
private method of the metaclass (EnumMetaclass._get_mixins)

----------
messages: 188920
nosy: ncoghlan
priority: low
severity: normal
stage: needs patch
status: open
title: Support creation of extensible enums through metaclass subclassing
type: enhancement
versions: Python 3.4

_______________________________________
Python tracker <rep...@bugs.python.org>
<http://bugs.python.org/issue17954>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: 
http://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com

Reply via email to