Skip to content

Latest commit

 

History

History
74 lines (50 loc) · 2.27 KB

107.md

File metadata and controls

74 lines (50 loc) · 2.27 KB

#怎样在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'