[Python-Dev] [Python-checkins] peps: Pre-alpha draft for PEP 435 (enum). The name is not important at the moment, as
python at mrabarnett.plus.com
Mon Feb 25 18:19:55 CET 2013
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
> 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:
> elif animal is Animals.bee:
> elif animal is Animals.ant:
> but commonly used:
> def utter(animal):
> if animal == Animals.cat:
> elif animal == Animals.bee:
> elif animal == Animals.ant:
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``
More information about the Python-Dev