@@ -247,7 +247,10 @@ def __set_name__(self, enum_class, member_name):
247
247
if not enum_class ._use_args_ :
248
248
enum_member = enum_class ._new_member_ (enum_class )
249
249
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
251
254
else :
252
255
enum_member = enum_class ._new_member_ (enum_class , * args )
253
256
if not hasattr (enum_member , '_value_' ):
@@ -562,7 +565,13 @@ def __new__(metacls, cls, bases, classdict, *, boundary=None, _simple=False, **k
562
565
classdict ['__str__' ] = enum_class .__str__
563
566
for name in ('__repr__' , '__str__' , '__format__' , '__reduce_ex__' ):
564
567
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 )
566
575
#
567
576
# for Flag, add __or__, __and__, __xor__, and __invert__
568
577
if Flag is not None and issubclass (enum_class , Flag ):
@@ -937,16 +946,18 @@ def _find_data_repr_(mcls, class_name, bases):
937
946
@classmethod
938
947
def _find_data_type_ (mcls , class_name , bases ):
939
948
data_types = set ()
949
+ base_chain = set ()
940
950
for chain in bases :
941
951
candidate = None
942
952
for base in chain .__mro__ :
953
+ base_chain .add (base )
943
954
if base is object :
944
955
continue
945
956
elif issubclass (base , Enum ):
946
957
if base ._member_type_ is not object :
947
958
data_types .add (base ._member_type_ )
948
959
break
949
- elif '__new__' in base .__dict__ :
960
+ elif '__new__' in base .__dict__ or '__init__' in base . __dict__ :
950
961
if issubclass (base , Enum ):
951
962
continue
952
963
data_types .add (candidate or base )
@@ -1658,7 +1669,13 @@ def convert_class(cls):
1658
1669
enum_class = type (cls_name , (etype , ), body , boundary = boundary , _simple = True )
1659
1670
for name in ('__repr__' , '__str__' , '__format__' , '__reduce_ex__' ):
1660
1671
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 )
1662
1679
gnv_last_values = []
1663
1680
if issubclass (enum_class , Flag ):
1664
1681
# Flag / IntFlag
@@ -1989,7 +2006,6 @@ def _old_convert_(etype, name, module, filter, source=None, *, boundary=None):
1989
2006
members .sort (key = lambda t : t [0 ])
1990
2007
cls = etype (name , members , module = module , boundary = boundary or KEEP )
1991
2008
cls .__reduce_ex__ = _reduce_ex_by_global_name
1992
- cls .__repr__ = global_enum_repr
1993
2009
return cls
1994
2010
1995
2011
_stdlib_enums = IntEnum , StrEnum , IntFlag
0 commit comments