Skip to content

Instantly share code, notes, and snippets.

@rusek
Created September 26, 2015 09:52
Show Gist options
  • Save rusek/dcf221f7c30f4ffc6ded to your computer and use it in GitHub Desktop.
Save rusek/dcf221f7c30f4ffc6ded to your computer and use it in GitHub Desktop.
Python3 Enum with a separate class for storing constants
from collections import OrderedDict
class EnumMeta(type):
def __init__(cls, name, bases, attrs):
super(EnumMeta, cls).__init__(name, bases, attrs)
if 'Consts' not in attrs:
cls.Consts = type(
'Consts',
(Enum.Consts, ),
dict(__module__=cls.__module__, _related_enum_class=cls)
)
class EnumConstsMeta(type):
_related_enum_class = None
values = ()
@classmethod
def __prepare__(mcs, cls, bases):
return OrderedDict()
def __init__(cls, name, bases, attrs):
super(EnumConstsMeta, cls).__init__(name, bases, attrs)
if cls._related_enum_class is not None:
cls._related_enum_class.Consts.values = tuple(
val for val in attrs.values() if isinstance(val, cls._related_enum_class)
)
class Enum(metaclass=EnumMeta):
class Consts(metaclass=EnumConstsMeta):
pass
@classmethod
def get_all(cls):
return cls.Consts.values
class SmallNum(Enum):
def __init__(self, num):
self._num = num
def __repr__(self):
return 'SmallNum(%r)' % self._num
class SmallNumConsts(SmallNum.Consts):
ZERO = SmallNum(0)
ONE = SmallNum(1)
TWO = SmallNum(2)
THREE = SmallNum(3)
FOUR = SmallNum(4)
print(SmallNum.get_all())
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment