except ImportError:
from collections import OrderedDict
-
__all__ = [
'EnumMeta',
'Enum', 'IntEnum', 'Flag', 'IntFlag',
cls.__module__ = '<unknown>'
_auto_null = object()
+
+
class auto:
"""
Instances are replaced with an appropriate value in Enum class suites.
def __prepare__(metacls, cls, bases):
# create the namespace dict
enum_dict = _EnumDict()
+
# inherit previous flags and _generate_next_value_ function
member_type, first_enum = metacls._get_mixins_(bases)
+
if first_enum is not None:
enum_dict['_generate_next_value_'] = getattr(first_enum, '_generate_next_value_', None)
+
return enum_dict
def __new__(metacls, cls, bases, classdict):
if invalid_names:
raise ValueError('Invalid enum member name: {0}'.format(
','.join(invalid_names)))
-
+
# create a default docstring if one has not been provided
if '__doc__' not in classdict:
classdict['__doc__'] = 'An enumeration.'
# create our new Enum type
enum_class = super().__new__(metacls, cls, bases, classdict)
+
enum_class._member_names_ = [] # names in definition order
enum_class._member_map_ = OrderedDict() # name->value map
enum_class._member_type_ = member_type
# save attributes from super classes so we know if we can take
# the shortcut of storing members in the class dict
+
base_attributes = {a for b in enum_class.mro() for a in b.__dict__}
# Reverse value->name map for hashable values.
_order_ = _order_.replace(',', ' ').split()
if _order_ != enum_class._member_names_:
raise TypeError('member order does not match _order_')
-
+ pk('enum class fom new',enum_class)
return enum_class
def __bool__(self):
bases: the tuple of bases that was given to __new__
"""
+
if not bases:
return object, Enum
issubclass(base, Enum) and
base._member_names_):
raise TypeError("Cannot extend enumerations")
+
# base is now the last base in bases
if not issubclass(base, Enum):
raise TypeError("new enumerations must be created as "
# now find the correct __new__, checking to see of one was defined
# by the user; also check earlier enum classes in case a __new__ was
# saved as __new_member__
+
__new__ = classdict.get('__new__', None)
# should __new__ be saved as __new_member__ later?
return __new__, save_new, use_args
+pk(1)
class Enum(metaclass=EnumMeta):
"""Generic enumeration.
module_globals[name] = cls
return cls
+pk(2)
class IntEnum(int, Enum):
"""Enum where members are also (and must be) ints"""