我有一段代码已经由其他人编写,它实现了“枚举”类型,就像在C中一样,但代码在__cmp__
函数中失败并出现错误:
assert self.EType is other.EType,
AttributeError: 'str' object has no attribute 'EType'
请您告诉我如何对str
和EType
个对象进行比较,以解决错误?
def enum(*parameters):
assert parameters, "Empty enums are not supported"
class EClass(object):
""" Internal class """
__slots__ = parameters
def __iter__(self):
return iter(constants)
def __len__(self):
return len(constants)
def __getitem__(self, i):
return constants[i]
def __repr__(self):
return 'Enum' + str(parameters)
def __str__(self):
return 'enum ' + str(constants)
class EValue(object):
""" Internal class """
__slots__ = '__value'
def __init__(self, value):
self.__value = value
Value = property(lambda self: self.__value)
EType = property(lambda self: EType)
def __hash__(self):
return hash(self.__value)
def __cmp__(self, other):
assert self.EType is other.EType, \
"Only values from the same enum are comparable"
return cmp(self.__value, other.__value)
def __invert__(self):
return constants[maximum - self.__value]
def __nonzero__(self):
return bool(self.__value)
def __repr__(self):
return str(parameters[self.__value])
maximum = len(parameters) - 1
print ("maximum %d") % maximum
constants = [None] * len(parameters)
for i, each in enumerate(parameters):
val = EValue(i)
setattr(EClass, each, val)
constants[i] = val
constants = tuple(constants)
EType = EClass()
return EType
if __name__ == "__main__":
call_type = "test1"
if call_type not in enum('test1', 'test2'):
print 1
答案 0 :(得分:0)
问题不在于__cmp__
功能,而在于您使用枚举的方式:
call_type = "test1"
if call_type not in enum('test1', 'test2'): ...
枚举中的对象不是字符串,但EValue
的实例和__cmp__
的{{1}}函数不能与另一个EValue
进行比较。 (这样做也没有多大意义)。
要解决此问题,您可以检查字符串是否在枚举值的字符串表示中,或者向枚举类添加一个返回值的函数(存储在EValue
中)。
__slots__
the_enum = enum('test1', 'test2')
print "test1" in map(repr, the_enum)
print "test1" in the_enum.values()
方法可能如下所示:
values()