diff -r a5681f50bae2 Lib/enum.py --- a/Lib/enum.py Mon Jul 22 22:08:17 2013 -0700 +++ b/Lib/enum.py Wed Jul 24 09:43:23 2013 -0400 @@ -152,12 +152,12 @@ args = (args, ) # wrap it one more time if not use_args: enum_member = __new__(enum_class) - original_value = value + if not hasattr(enum_member, '_value_'): + enum_member._value_ = value else: enum_member = __new__(enum_class, *args) - original_value = member_type(*args) - if not hasattr(enum_member, '_value_'): - enum_member._value_ = original_value + if not hasattr(enum_member, '_value_'): + enum_member._value_ = member_type(*args) value = enum_member._value_ enum_member._member_type_ = member_type enum_member._name_ = member_name diff -r a5681f50bae2 Lib/test/test_enum.py --- a/Lib/test/test_enum.py Mon Jul 22 22:08:17 2013 -0700 +++ b/Lib/test/test_enum.py Wed Jul 24 09:43:23 2013 -0400 @@ -934,6 +934,22 @@ self.assertEqual(ColorInAList.red.value, [1]) self.assertEqual(ColorInAList([1]), ColorInAList.red) + def test_conflicting_types_resolved_in_new(self): + class LabelledIntEnum(int, Enum): + def __new__(cls, *args): + value, label = args + obj = int.__new__(cls, value) + obj.label = label + obj._value_ = value + return obj + + class LabelledList(LabelledIntEnum): + unprocessed = (1, "Unprocessed") + payment_complete = (2, "Payment Complete") + + self.assertEqual(list(LabelledList), [LabelledList.unprocessed, LabelledList.payment_complete]) + self.assertEqual(LabelledList.unprocessed, 1) + self.assertEqual(LabelledList(1), LabelledList.unprocessed) class TestUnique(unittest.TestCase):