46
43
if not isinstance(name, basestring):
47
raise EnumError("enum name is not a string: %s" % name)
44
raise EnumError("Enum name is not a string: %s" % name)
49
46
if isinstance(value, basestring):
50
47
if value not in unique_names:
51
raise EnumError("enum value does not define: %s" % value)
48
raise EnumError("Enum value does not define: %s" % value)
52
49
value = getattr(self, value)
54
51
if not isinstance(value, (int, long)):
55
raise EnumError("enum value is not an integer: %s" % value)
52
raise EnumError("Enum value is not an integer: %s" % value)
57
54
if name in unique_names:
58
raise EnumError("enum name is not unique: %s" % name)
55
raise EnumError("Enum name is not unique: %s" % name)
60
57
# Add name to attributes
61
58
unique_names.add(name)
62
setattr(self, name, value)
59
self.__dict__[name] = value
64
61
# Add value to private dictionary
65
values = self.__enum_values__.setdefault(value, [])
62
values = enum_values.setdefault(value, [])
66
63
values.append(name)
71
def enum_name_to_value(enum, name):
73
return getattr(enum, name)
74
except AttributeError:
75
raise EnumError("enum name unknown: %s" % name)
78
def enum_value_to_names(enum, value):
80
return enum.__enum_values__[value]
82
raise EnumError("enum value unknown: %s" % value)
85
def enum_value_to_name_string(enum, value):
86
names = enum_value_to_names(enum, value)
88
names[:-1] = [", ".join(names[:-1])]
90
return " or ".join(names)
67
def __setattr__(self, name, value):
68
raise EnumError("Enum does not support setting attributes.")
70
def __delattr__(self, name):
71
raise EnumError("Enum does not support deleting attributes.")
74
return len(self.__values__)
76
def __getitem__(self, index):
78
names = self.__values__[index]
80
raise EnumError("Enum index out of range")
83
names[:-1] = [", ".join(names[:-1])]
85
return " or ".join(names)
87
def __setitem__(self, index, value):
88
raise EnumError("Enum does not support setting items.")
90
def __delitem__(self, index):
91
raise EnumError("Enum does not support deleting items.")
94
return self.__values__.iterkeys()
96
def __contains__(self, value):
97
if isinstance(value, basestring):
98
for names in self.__values__.itervalues():
104
return value in self.__values__.iterkeys()