Skip to content

Instantly share code, notes, and snippets.

@mdellavo
Created June 13, 2010 16:37
Show Gist options
  • Save mdellavo/436792 to your computer and use it in GitHub Desktop.
Save mdellavo/436792 to your computer and use it in GitHub Desktop.
class EnumItem(object):
def __init__(self, name, value):
self.name = name
self.value = value
class Enum(type):
def __init__(self, name, bases, dict):
super(Enum, self).__init__(name, bases, dict)
self.collection = {}
if hasattr(self, '__items__'):
for value, item in enumerate(self.__items__):
self.add_value(item, value)
else:
for k in dict:
if k[0] != '_' and isinstance(dict[k], (int, float, str)):
self.add_value(k, dict[k])
def __call__(self, *args, **kwargs):
return self
def __iter__(self):
return iter(self.values)
def __getitem__(self, name):
if name not in self.collection:
raise KeyError('%s not a member of enumeration' % name)
return self.collection[name].value
def add_value(self, name, value):
if value in self.values:
raise ValueError('Value %s enumerated more than once' % str(value))
self.collection[name] = EnumItem(name, value)
@property
def values(self):
return [i.value for i in self.collection.values()]
@property
def items(self):
return [(i.name, i.value) for i in self.collection.values()]
@property
def names(self):
return [i.name for i in self.collection.values()]
def item(self, value):
for k in self.collection:
if self.collection[k].value == value:
return self.collection[k]
return None
def item_by_name(self, name):
return self.collection.get(name)
def name(self, value):
item = self.item(value)
return item.name if item else None
def label(self, value):
item = self.item(value)
return getattr(self.Labels, item.name) if item else None
def label_by_name(self, name):
item = self.collection.get(name)
return getattr(self.Labels, item.name) if item else None
if __name__ == '__main__':
import string
class Foos:
__metaclass__ = Enum
__items__ = list(string.lowercase)
print Foos.items
class SetListNames:
__metaclass__ = Enum
SET1 = '1'
SET2 = '2'
ENCORE = 'e'
class Labels:
SET1 = 'Set 1'
SET2 = 'Set 2'
ENCORE = 'Encore'
SetListNames.label(SetListNames.SET1)
for value in SetListNames:
print '%20s%20s%20s' % (value, SetListNames.label(value), SetListNames.name(value))
print SetListNames['SET2']
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment