@@ -247,7 +247,10 @@ def __set_name__(self, enum_class, member_name):
247247 if not enum_class ._use_args_ :
248248 enum_member = enum_class ._new_member_ (enum_class )
249249 if not hasattr (enum_member , '_value_' ):
250- enum_member ._value_ = value
250+ try :
251+ enum_member ._value_ = enum_class ._member_type_ (* args )
252+ except Exception as exc :
253+ enum_member ._value_ = value
251254 else :
252255 enum_member = enum_class ._new_member_ (enum_class , * args )
253256 if not hasattr (enum_member , '_value_' ):
@@ -562,7 +565,13 @@ def __new__(metacls, cls, bases, classdict, *, boundary=None, _simple=False, **k
562565 classdict ['__str__' ] = enum_class .__str__
563566 for name in ('__repr__' , '__str__' , '__format__' , '__reduce_ex__' ):
564567 if name not in classdict :
565- setattr (enum_class , name , getattr (first_enum , name ))
568+ # check for mixin overrides before replacing
569+ enum_method = getattr (first_enum , name )
570+ found_method = getattr (enum_class , name )
571+ object_method = getattr (object , name )
572+ data_type_method = getattr (member_type , name )
573+ if found_method in (data_type_method , object_method ):
574+ setattr (enum_class , name , enum_method )
566575 #
567576 # for Flag, add __or__, __and__, __xor__, and __invert__
568577 if Flag is not None and issubclass (enum_class , Flag ):
@@ -937,16 +946,18 @@ def _find_data_repr_(mcls, class_name, bases):
937946 @classmethod
938947 def _find_data_type_ (mcls , class_name , bases ):
939948 data_types = set ()
949+ base_chain = set ()
940950 for chain in bases :
941951 candidate = None
942952 for base in chain .__mro__ :
953+ base_chain .add (base )
943954 if base is object :
944955 continue
945956 elif issubclass (base , Enum ):
946957 if base ._member_type_ is not object :
947958 data_types .add (base ._member_type_ )
948959 break
949- elif '__new__' in base .__dict__ :
960+ elif '__new__' in base .__dict__ or '__init__' in base . __dict__ :
950961 if issubclass (base , Enum ):
951962 continue
952963 data_types .add (candidate or base )
@@ -1658,7 +1669,13 @@ def convert_class(cls):
16581669 enum_class = type (cls_name , (etype , ), body , boundary = boundary , _simple = True )
16591670 for name in ('__repr__' , '__str__' , '__format__' , '__reduce_ex__' ):
16601671 if name not in body :
1661- setattr (enum_class , name , getattr (etype , name ))
1672+ # check for mixin overrides before replacing
1673+ enum_method = getattr (etype , name )
1674+ found_method = getattr (enum_class , name )
1675+ object_method = getattr (object , name )
1676+ data_type_method = getattr (member_type , name )
1677+ if found_method in (data_type_method , object_method ):
1678+ setattr (enum_class , name , enum_method )
16621679 gnv_last_values = []
16631680 if issubclass (enum_class , Flag ):
16641681 # Flag / IntFlag
@@ -1989,7 +2006,6 @@ def _old_convert_(etype, name, module, filter, source=None, *, boundary=None):
19892006 members .sort (key = lambda t : t [0 ])
19902007 cls = etype (name , members , module = module , boundary = boundary or KEEP )
19912008 cls .__reduce_ex__ = _reduce_ex_by_global_name
1992- cls .__repr__ = global_enum_repr
19932009 return cls
19942010
19952011_stdlib_enums = IntEnum , StrEnum , IntFlag
0 commit comments