python中的枚举函数实现失败

时间:2014-01-29 10:45:55

标签: python

我有一段代码已经由其他人编写,它实现了“枚举”类型,就像在C中一样,但代码在__cmp__函数中失败并出现错误:

assert self.EType is other.EType, 
AttributeError: 'str' object has no attribute 'EType'

请您告诉我如何对strEType个对象进行比较,以解决错误?

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

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()