#!/usr/bin/env python def enum(*names): """A true immutable symbolic enumeration with qualified value access.""" class EnumValue(object): __slots__ = ("type", "value",) def __init__(self, type, value): self.type = type self.value = value def __hash__(self): return hash(self.value) def __cmp__(self, other): return cmp(self.value, other.value) def __invert__(self): return self.type.values[(len(self.type) - 1) - self.value] def __nonzero__(self): return bool(self.value) def __repr__(self): return str(self.type.names[self.value]) class EnumClass(object): __slots__ = ("names", "mapping", "values",) def __init__(self, *names): self.names = names self.values = dict( (i, EnumValue(self, i)) for i in range(len(names)) ) self.mapping = dict( (names[i], value) for i, value in self.values.items() ) def __getattr__(self, attr): try: return self.mapping[attr] except KeyError: raise AttributeError(attr) def __iter__(self): return iter(self.values.values()) def __len__(self): return len(self.values) def __getitem__(self, i): return self.values[i] def __repr__(self): return "".format(str(self.names)) def __str__(self): return "enum {0:s}".format(str(self.values)) return EnumClass(*names) Days = enum("Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat") print Days print Days.Mon print Days.Fri print Days.Mon < Days.Fri print list(Days) for day in Days: print "Day: {0:s}".format(repr(day)) Confirmation = enum("No", "Yes") answer = Confirmation.No print "Your answer is not", ~answer