rank vote url
7 1112 431 1201 url

在Python里如何用枚举类型?

我是一个C#开发者,但是我现在做的工作是关于Python的.

怎么在Python里代替枚举类型呢?


PEP435标准里已经把枚举添加到Python3.4版本,在Pypi中也可以向后支持3.3, 3.2, 3.1, 2.7, 2.6, 2.5, 和 2.4版本.

如果想向后兼容$ pip install enum34,如果下载enum(没有数字)将会是另一个版本.

  1. from enum import Enum
  2. Animal = Enum('Animal', 'ant bee cat dog')

或者等价于:

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

在更早的版本,下面这种方法来完成枚举:

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

像这样来用:

  1. >>> Numbers = enum(ONE=1, TWO=2, THREE='three')
  2. >>> Numbers.ONE
  3. 1
  4. >>> Numbers.TWO
  5. 2
  6. >>> Numbers.THREE
  7. 'three'

也很容易支持自动计数,像下面这样:

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

这样用:

  1. >>> Numbers = enum('ZERO', 'ONE', 'TWO')
  2. >>> Numbers.ZERO
  3. 0
  4. >>> Numbers.ONE
  5. 1

如果要把值转换为名字可以加入下面的方法:

  1. def enum(*sequential, **named):
  2. enums = dict(zip(sequential, range(len(sequential))), **named)
  3. reverse = dict((value, key) for key, value in enums.iteritems())
  4. enums['reverse_mapping'] = reverse
  5. return type('Enum', (), enums)

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

  1. >>> Numbers.reverse_mapping['three']
  2. 'THREE'