#怎样在Python中实现Enum(枚举)的功能
原问题地址:http://stackoverflow.com/questions/36932/how-can-i-represent-an-enum-in-python
##问题:
我是一个C#开发者,但目前致力于Python的一个项目。
我怎样在Python中实现类似于Enum(枚举)的功能?
##回答:
根据 PEP 435中的描述,Enums已被添加到Python 3.4 中。在Python3.3,3.2,3.1,2.7,2.6,2.5和2.4的pypi中也增添了Enums。
对于更高级的Enum技术,请访问aenum library(Python 2.7,3.3+,和enum34是同一作者)。
- 使用enum34,安装方法
$ pip install enum34
- 使用aenum, 安装方法
$ pip install aenum
安装enum(无编号)将得到一个完全不同的、不兼容的版本。
from enum import Enum # for enum34, or the stdlib version
# from aenum import Enum # for the aenum version
Animal = Enum('Animal', 'ant bee cat dog')
或者相当于:
class Animal(Enum):
ant = 1
bee = 2
cat = 3
dog = 4
在早期版本中,实现enums的一种方法是:
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)
这样做将覆盖任何带有该名字的内容,但是它有助于在输出时渲染你的enums(枚举)。如果反向映射不存在,它将放弃KeyError。下面看第一个例子:
>>> Numbers.reverse_mapping['three']
'THREE'