On 2013-02-25 16:37, Barry Warsaw wrote:
On Feb 25, 2013, at 07:12 AM, Ethan Furman wrote:

And if, in those places, the enums were based on ints (or strings), would it
hurt you?  Because in the places where I, as well as many others, use enums
we *need* the int portion; and having to wrap the enum in an int() call is
seven extra keystrokes (minor) and a heap of visual clutter (major),
destroying any value the enum was supposed to have.

Yes, I think enum values inheriting from int (or string) would hurt.

First, as your question implies, which is it?  int or str?  Some people want
int some want str.  It can't be both, and I don't think we need two enum
types.

It's a deeper question though, because if enum values inherited from int, then
people would expect things like ``Colors.red == 1`` to work.  Maybe you think
that doesn't look so bad, but that also implies:

     >>> Colors = make('Colors', 'red green blue'.split())
     >>> Animals = make('Animals', 'ant bee cat'.split())
     >>> Colors.green == Animals.bee

and *that* I have a problem with.  While I generally recommend that that enum
values be comparable by identity, not by equality, lots of people will still
use `==` instead of `is`.  My preference:

def utter(animal):
     if animal is Animals.cat:
         print('meow')
     elif animal is Animals.bee:
         print('buzz')
     elif animal is Animals.ant:
         print('fphfft')

but commonly used:

def utter(animal):
     if animal == Animals.cat:
         print('meow')
     elif animal == Animals.bee:
         print('buzz')
     elif animal == Animals.ant:
         print('fphfft')

Would we be doing either of those? Surely we would be using a dict
instead, and what does a dict use, identity or equality?

In both cases, I want ``utter(Colors.green)`` and ``utter(2)`` to fail.  In
the latter, if enum values are derived from ints, the second example will
succeed.  Currently, in both cases ``utter(Animals.cat)`` succeeds.

Even worse, if my library defines an Animals enum and your library defines a
different Animals enum, I do not want ``utter(YourAnimals.dog)`` to print
"meow" :).

I get that you think wrapping the value in int() is ugly.  I have a compromise
that you might find acceptable.  EnumValues already have .enum and .name
attributes, to give you the value's class and string name respectively.  It
would be trivial to add a .int attribute to return the value.

Thus if you want the int value, it would be easy enough to say
``Colors.green.int`` or ``Animals.bee.int``

https://bugs.launchpad.net/flufl.enum/+bug/1132859


_______________________________________________
Python-Dev mailing list
Python-Dev@python.org
http://mail.python.org/mailman/listinfo/python-dev
Unsubscribe: 
http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com

Reply via email to