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