1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 """
23 Enum class implementation
24 """
25
26
43
45 __metaclass__ = EnumMetaClass
46 - def __init__(self, value, name, nick=None):
54
56 return '<enum %s of type %s>' % (self.name,
57 self.__class__.__name__)
58
59 - def get(klass, value):
61 get = classmethod(get)
62
63 - def set(klass, value, item):
65 set = classmethod(set)
66
68 - def __new__(klass, type_name, names=(), nicks=(), **extras):
69 if nicks:
70 if len(names) != len(nicks):
71 raise TypeError("nicks must have the same length as names")
72 else:
73 nicks = names
74
75 for extra in extras.values():
76 if not isinstance(extra, tuple):
77 raise TypeError('extra must be a tuple, not %s' % type(extra))
78
79 if len(extra) != len(names):
80 raise TypeError("extra items must have a length of %d" %
81 len(names))
82
83
84
85 etype = EnumMetaClass(type_name, (Enum,), {'__enums__': {}})
86 for value, name in enumerate(names):
87 enum = etype(value, name, nicks[value])
88 for extra_key, extra_values in extras.items():
89 assert not hasattr(enum, extra_key)
90 setattr(enum, extra_key, extra_values[value])
91 etype[value] = enum
92
93 return etype
94