@@ -123,10 +123,12 @@ class EnumMeta(type):
123
123
"""Metaclass for Enum"""
124
124
@classmethod
125
125
def __prepare__ (metacls , cls , bases ):
126
+ # check that previous enum members do not exist
127
+ metacls ._check_for_existing_members (cls , bases )
126
128
# create the namespace dict
127
129
enum_dict = _EnumDict ()
128
130
# inherit previous flags and _generate_next_value_ function
129
- member_type , first_enum = metacls ._get_mixins_ (bases )
131
+ member_type , first_enum = metacls ._get_mixins_ (cls , bases )
130
132
if first_enum is not None :
131
133
enum_dict ['_generate_next_value_' ] = getattr (first_enum , '_generate_next_value_' , None )
132
134
return enum_dict
@@ -142,7 +144,7 @@ def __new__(metacls, cls, bases, classdict):
142
144
ignore = classdict ['_ignore_' ]
143
145
for key in ignore :
144
146
classdict .pop (key , None )
145
- member_type , first_enum = metacls ._get_mixins_ (bases )
147
+ member_type , first_enum = metacls ._get_mixins_ (cls , bases )
146
148
__new__ , save_new , use_args = metacls ._find_new_ (classdict , member_type ,
147
149
first_enum )
148
150
@@ -401,7 +403,7 @@ def _create_(cls, class_name, names, *, module=None, qualname=None, type=None, s
401
403
"""
402
404
metacls = cls .__class__
403
405
bases = (cls , ) if type is None else (type , cls )
404
- _ , first_enum = cls ._get_mixins_ (bases )
406
+ _ , first_enum = cls ._get_mixins_ (cls , bases )
405
407
classdict = metacls .__prepare__ (class_name , bases )
406
408
407
409
# special processing needed for names?
@@ -474,7 +476,14 @@ def _convert_(cls, name, module, filter, source=None):
474
476
return cls
475
477
476
478
@staticmethod
477
- def _get_mixins_ (bases ):
479
+ def _check_for_existing_members (class_name , bases ):
480
+ for chain in bases :
481
+ for base in chain .__mro__ :
482
+ if issubclass (base , Enum ) and base ._member_names_ :
483
+ raise TypeError ("%s: cannot extend enumeration %r" % (class_name , base .__name__ ))
484
+
485
+ @staticmethod
486
+ def _get_mixins_ (class_name , bases ):
478
487
"""Returns the type for creating enum members, and the first inherited
479
488
enum class.
480
489
@@ -499,7 +508,7 @@ def _find_data_type(bases):
499
508
elif not issubclass (base , Enum ):
500
509
candidate = base
501
510
if len (data_types ) > 1 :
502
- raise TypeError ('too many data types: %r' % data_types )
511
+ raise TypeError ('%r: too many data types: %r' % ( class_name , data_types ) )
503
512
elif data_types :
504
513
return data_types [0 ]
505
514
else :
0 commit comments