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