枚举类型的使用?

PEP435 标准已经把枚举添加到 Python3.4 版本,在 PyPi 中也可以向后支持,通过:

pip install enum34

如果下载 enum 没有数字将会是另一个版本

from enum import Enum
animal = Enum("Animal", "ant bee cat dog")

等价于:

class Animals(Enum):
    ant = 1
    bee = 2
    cat = 3
    dog = 4

在更早以前,有这些方法:

def enum(**enums):
    return type('Enum', (), enums)

>>> Numbers = enum(ONE=1, TWO=2, THREE='three')
>>> Numbers.ONE
1
>>> Numbers.TWO
2
>>> Numbers.THREE
'three'

或者

def enum(*sequential, **named):
    enums = dict(zip(sequential, range(len(sequential))), **named)
    return type('Enum', (), enums)

>>> Numbers = enum('ZERO', 'ONE', 'TWO')
>>> Numbers.ZERO
0
>>> Numbers.ONE
1

把值转换为名字:

def enum(*sequential, **named):
    enums = dict(zip(sequential, range(len(sequential))), **named)
    reverse = dict((value, key) for key, value in enums.iteritems())
    enums['reverse_mapping'] = reverse
    return type('Enum', (), enums)
>>> Numbers.reverse_mapping['three']
'THREE'

这样会覆盖名字下的所有东西,但是对于枚举的输出很有用。如果转换的值不存在就会抛出 KeyError 异常

Last updated