Created
June 13, 2010 16:37
-
-
Save mdellavo/436792 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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