@@ -165,9 +165,11 @@ def __new__(metacls, cls, bases, classdict):
165165 enum_class ._member_map_ = {} # name->value map
166166 enum_class ._member_type_ = member_type
167167
168- # save attributes from super classes so we know if we can take
169- # the shortcut of storing members in the class dict
170- base_attributes = {a for b in enum_class .mro () for a in b .__dict__ }
168+ # save DynamicClassAttribute attributes from super classes so we know
169+ # if we can take the shortcut of storing members in the class dict
170+ dynamic_attributes = {k for c in enum_class .mro ()
171+ for k , v in c .__dict__ .items ()
172+ if isinstance (v , DynamicClassAttribute )}
171173
172174 # Reverse value->name map for hashable values.
173175 enum_class ._value2member_map_ = {}
@@ -227,7 +229,7 @@ def __new__(metacls, cls, bases, classdict):
227229 enum_class ._member_names_ .append (member_name )
228230 # performance boost for any member that would not shadow
229231 # a DynamicClassAttribute
230- if member_name not in base_attributes :
232+ if member_name not in dynamic_attributes :
231233 setattr (enum_class , member_name , enum_member )
232234 # now add to _member_map_
233235 enum_class ._member_map_ [member_name ] = enum_member
@@ -428,6 +430,45 @@ def _create_(cls, class_name, names, *, module=None, qualname=None, type=None, s
428430
429431 return enum_class
430432
433+ def _convert_ (cls , name , module , filter , source = None ):
434+ """
435+ Create a new Enum subclass that replaces a collection of global constants
436+ """
437+ # convert all constants from source (or module) that pass filter() to
438+ # a new Enum called name, and export the enum and its members back to
439+ # module;
440+ # also, replace the __reduce_ex__ method so unpickling works in
441+ # previous Python versions
442+ module_globals = vars (sys .modules [module ])
443+ if source :
444+ source = vars (source )
445+ else :
446+ source = module_globals
447+ # _value2member_map_ is populated in the same order every time
448+ # for a consistent reverse mapping of number to name when there
449+ # are multiple names for the same number.
450+ members = [
451+ (name , value )
452+ for name , value in source .items ()
453+ if filter (name )]
454+ try :
455+ # sort by value
456+ members .sort (key = lambda t : (t [1 ], t [0 ]))
457+ except TypeError :
458+ # unless some values aren't comparable, in which case sort by name
459+ members .sort (key = lambda t : t [0 ])
460+ cls = cls (name , members , module = module )
461+ cls .__reduce_ex__ = _reduce_ex_by_name
462+ module_globals .update (cls .__members__ )
463+ module_globals [name ] = cls
464+ return cls
465+
466+ def _convert (cls , * args , ** kwargs ):
467+ import warnings
468+ warnings .warn ("_convert is deprecated and will be removed in 3.9, use "
469+ "_convert_ instead." , DeprecationWarning , stacklevel = 2 )
470+ return cls ._convert_ (* args , ** kwargs )
471+
431472 @staticmethod
432473 def _get_mixins_ (bases ):
433474 """Returns the type for creating enum members, and the first inherited
@@ -613,40 +654,6 @@ def value(self):
613654 """The value of the Enum member."""
614655 return self ._value_
615656
616- @classmethod
617- def _convert (cls , name , module , filter , source = None ):
618- """
619- Create a new Enum subclass that replaces a collection of global constants
620- """
621- # convert all constants from source (or module) that pass filter() to
622- # a new Enum called name, and export the enum and its members back to
623- # module;
624- # also, replace the __reduce_ex__ method so unpickling works in
625- # previous Python versions
626- module_globals = vars (sys .modules [module ])
627- if source :
628- source = vars (source )
629- else :
630- source = module_globals
631- # _value2member_map_ is populated in the same order every time
632- # for a consistent reverse mapping of number to name when there
633- # are multiple names for the same number.
634- members = [
635- (name , value )
636- for name , value in source .items ()
637- if filter (name )]
638- try :
639- # sort by value
640- members .sort (key = lambda t : (t [1 ], t [0 ]))
641- except TypeError :
642- # unless some values aren't comparable, in which case sort by name
643- members .sort (key = lambda t : t [0 ])
644- cls = cls (name , members , module = module )
645- cls .__reduce_ex__ = _reduce_ex_by_name
646- module_globals .update (cls .__members__ )
647- module_globals [name ] = cls
648- return cls
649-
650657
651658class IntEnum (int , Enum ):
652659 """Enum where members are also (and must be) ints"""
0 commit comments