@@ -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 ):
@@ -950,16 +959,18 @@ def _find_data_repr_(mcls, class_name, bases):
950
959
@classmethod
951
960
def _find_data_type_ (mcls , class_name , bases ):
952
961
data_types = set ()
962
+ base_chain = set ()
953
963
for chain in bases :
954
964
candidate = None
955
965
for base in chain .__mro__ :
966
+ base_chain .add (base )
956
967
if base is object :
957
968
continue
958
969
elif issubclass (base , Enum ):
959
970
if base ._member_type_ is not object :
960
971
data_types .add (base ._member_type_ )
961
972
break
962
- elif '__new__' in base .__dict__ :
973
+ elif '__new__' in base .__dict__ or '__init__' in base . __dict__ :
963
974
if issubclass (base , Enum ):
964
975
continue
965
976
data_types .add (candidate or base )
@@ -1671,7 +1682,13 @@ def convert_class(cls):
1671
1682
enum_class = type (cls_name , (etype , ), body , boundary = boundary , _simple = True )
1672
1683
for name in ('__repr__' , '__str__' , '__format__' , '__reduce_ex__' ):
1673
1684
if name not in body :
1674
- setattr (enum_class , name , getattr (etype , name ))
1685
+ # check for mixin overrides before replacing
1686
+ enum_method = getattr (etype , name )
1687
+ found_method = getattr (enum_class , name )
1688
+ object_method = getattr (object , name )
1689
+ data_type_method = getattr (member_type , name )
1690
+ if found_method in (data_type_method , object_met
8000
hod ):
1691
+ setattr (enum_class , name , enum_method )
1675
1692
gnv_last_values = []
1676
1693
if issubclass (enum_class , Flag ):
1677
1694
# Flag / IntFlag
@@ -2002,7 +2019,6 @@ def _old_convert_(etype, name, module, filter, source=None, *, boundary=None):
2002
2019
members .sort (key = lambda t : t [0 ])
2003
2020
cls = etype (name , members , module = module , boundary = boundary or KEEP )
2004
2021
cls .__reduce_ex__ = _reduce_ex_by_global_name
2005
- cls .__repr__ = global_enum_repr
2006
2022
return cls
2007
2023
2008
2024
_stdlib_enums = IntEnum , StrEnum , IntFlag
0 commit comments