00001
00002
00003
00004
00005
00006
00007 class Enumerate (object):
00008 """Similar to C++'s 'enum', but with a few extra toys. Takes a
00009 string with spaces in between the different 'enum' names (keys).
00010 If 'asInt' is true, then values will be integers (useful for array
00011 indicies). Once created, the enum values can not be changed."""
00012
00013 def __init__(self, names, prefix = '', asInt = False, intOffset = 0):
00014 biggest = smallest = ""
00015 self._keys = []
00016 self._valueDict = {}
00017 for count, name in enumerate (names.split()) :
00018
00019 if self.isValidKey (name):
00020 raise RuntimeError, \
00021 "You can not duplicate Enum Names '%s'" % name
00022
00023 key = "%s_%s" % (prefix, name)
00024 if asInt:
00025 key = count + intOffset
00026 object.__setattr__ (self, name, key)
00027 self._valueDict[key] = name
00028 self._keys.append (name)
00029
00030
00031 def isValidValue (self, value):
00032 """ Returns true if this value is a valid enum value"""
00033 return self._valueDict.has_key (value)
00034
00035
00036 def isValidKey (self, key):
00037 """ Returns true if this value is a valid enum key"""
00038 return self.__dict__.has_key (key)
00039
00040
00041 def valueToKey (self, value):
00042 """ Returns the key (if it exists) for a given enum value"""
00043 return self._valueDict.get (value, None)
00044
00045
00046 def keys (self):
00047 """ Returns copy of valid keys """
00048
00049
00050 return self._keys [:]
00051
00052
00053 def __setattr__ (self, name, value):
00054 """Lets me set internal values, but throws an error if any of
00055 the enum values are changed"""
00056 if not name.startswith ("_"):
00057
00058 raise RuntimeError, "You can not modify Enum values."
00059 else:
00060 object.__setattr__ (self, name, value)
00061
00062
00063 def __call__ (self, key):
00064 return self.__dict__.get (key, None)
00065