On 31 January 2013 12:27, Tim Delaney <timothy.c.delaney@gmail.com> wrote:
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.

Forgot about making it iterable - an easy-to-ad feature. Obviously it would iterate over the EnumValue instancess.

Thought I'd better make it explicit as well that this was based on Michael Foords brilliant work.

Tim Delaney