simples e flexivel
1 class Enum(object):
2 class EnumError(TypeError):
3 pass
4
5 def __init__(self):
6 self.__dict__['__rdict__'] = {} # reverse dict, value => key
7 self.__dict__['__ldict__'] = {} # labels dict, value => label
8
9 def __setattr__(self, name, value):
10 if name in self.__dict__:
11 raise self.EnumError, "%s is a constant value" % name
12 if not name.isupper():
13 raise NameError, 'enumeration constant %r not in uppercase' % name
14 self.__dict__[name] = value
15 self.__rdict__[value] = name
16
17 def __delattr__(self, name):
18 if name in self.__dict__:
19 raise self.EnumError, "Cannot unbind constant %s" % name
20 raise NameError, name
21
22 def validate(self, value):
23 if value not in self.__rdict__:
24 raise ValueError('%s is not a valid enumeration constant value' % value)
25 return True
26
27 def key(self, value):
28 if value not in self.__rdict__:
29 raise ValueError('%s is not a valid enumeration constant value' % value)
30 return self.__rdict__[value]
31
32 def label(self, value):
33 if value not in self.__rdict__:
34 raise ValueError('%s is not a valid enumeration constant value' % value)
35 return self.__ldict__.get(value) or self.__rdict__.get(value)
36
37 def setlabel(self, value, label):
38 if value not in self.__rdict__:
39 raise ValueError('%s is not a valid enumeration constant value' % value)
40 self.__ldict__[value] = label
41
42 def simpletest():
43 Zakarias = Enum()
44 Zakarias.ANNA = 1
45 Zakarias.BERNHARD = 2
46 Zakarias.CAESAR = 3
47
48 Zakarias.validate(Zakarias.ANNA)
49 Zakarias.validate(Zakarias.BERNHARD)
50 Zakarias.validate(Zakarias.CAESAR)
51
52 assert Zakarias.key(Zakarias.ANNA) == 'ANNA'
53 assert Zakarias.label(Zakarias.BERNHARD) == 'BERNHARD'
54 Zakarias.setlabel(Zakarias.CAESAR, 'Caesar Constant')
55 assert Zakarias.label(Zakarias.CAESAR) == 'Caesar Constant'
56
57 if __name__ == '__main__':
58 simpletest()