On 31 January 2013 08:32, Terry Reedy <tjreedy@udel.edu> wrote:
On 1/30/2013 10:30 AM, Michael Foord wrote:
On 30 January 2013 15:22, Michael Foord
With a Python 3 metaclass that provides default values for *looked
up* entries you could have this:
class Color(Enum):
RED, WHITE, BLUE
The lookup would create the member - with the appropriate value.
class values(dict):
def __init__(self):
self.value = 0
def __getitem__(self, key):
So RED, WHITE, BLUE are 1, 2, 3; not 0, 1, 2 as I and many readers might expect. That aside (which can be fixed), this is very nice.Here is a version that I think creates an enum with most of the features of traditional and modern enums.- Enum values are subclasses of int;- Only need to declare the enum key name;- Starts at zero by default;- Can change the start value;- Can have discontiguous values (e.g. 0, 1, 5, 6);- Can have other types of class attributes;- Ensures that there is a 1:1 mapping between key:value (throws an exception if either of these is violated;- Able to obtain the keys, values and items as per the mapping interface (sorted by value);- Lookup an enum by key or value;One thing to note is that *any* class attribute assigned a value which implements __index__ will be considered an enum value assignment.