On 02/05/13 02:43, Guido van Rossum wrote:

Here's how I would implement "extending" an enum if subclassing were
not allowed:

class Color(Enum):
   red = 1
   white = 2
   blue = 3

class ExtraColor(Enum):
   orange = 4
   yellow = 5
   green = 6

flag_colors = set(Color) | set(ExtraColor)

Now I can test "c in flag_colors" to check whether c is a flag color.

Earlier you argued that testing for enums should be done with isinstance, not 
"in". Or did I misunderstood? So I would have thought that isinstance(c, 
(Color, ExtraColor)) would be the way to check c.

I would prefer to write "c in ExtraColor", assuming c extends Color.


Lookups by value also become more complex. Instead of c = ExtraColor[value], 
this leads to two choices, both of which are equally ugly in my opinion:


c = [c for c in flag_colors if c.value == value][0]


try:
    c = ExtraColor[value]
except:  # I'm not sure what exception you get here
    c = Color[value]


There is a further problem if the two enum classes have duplicate values, by 
accident or design. Accident being more likely, since now you have no warning 
when ExtraColor defines a value that duplicates something in Color. flag_colors 
will now contain both duplicates, since enum values from different enums never 
compare equal, but that's probably not what you want.



--
Steven
_______________________________________________
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