<p>枚举已添加到Python 3.4中,如<a href="http://www.python.org/dev/peps/pep-0435/" rel="noreferrer">PEP 435</a>所述。在pypi上也是<a href="https://pypi.python.org/pypi/enum34" rel="noreferrer">backported to 3.3, 3.2, 3.1, 2.7, 2.6, 2.5, and 2.4</a>。</p>
<p>要获得更高级的枚举技术,请尝试<a href="https://pypi.python.org/pypi/aenum" rel="noreferrer">aenum library</a>(2.7,3.3+,与<code>enum34</code>作者相同)。py2和py3之间的代码不完全兼容,例如,您需要<a href="https://stackoverflow.com/a/25982264/57461">^{<cd2>} in python 2</a>)。</p>
<ul>
<li>要使用<code>enum34</code>,请执行<code>$ pip install enum34</code></li>
<li>要使用<code>aenum</code>,请执行<code>$ pip install aenum</code></li>
</ul>
<p>安装<code>enum</code>(无编号)将安装完全不同且不兼容的版本。</p>
<hr/>
<pre><code>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')
Animal.ant # returns <Animal.ant: 1>
Animal['ant'] # returns <Animal.ant: 1> (string lookup)
Animal.ant.name # returns 'ant' (inverse lookup)
</code></pre>
<p>或同等地:</p>
<pre><code>class Animal(Enum):
ant = 1
bee = 2
cat = 3
dog = 4
</code></pre>
<hr/>
<p>在早期版本中,实现枚举的一种方法是:</p>
<pre><code>def enum(**enums):
return type('Enum', (), enums)
</code></pre>
<p>其用法如下:</p>
<pre><code>>>> Numbers = enum(ONE=1, TWO=2, THREE='three')
>>> Numbers.ONE
1
>>> Numbers.TWO
2
>>> Numbers.THREE
'three'
</code></pre>
<p>您还可以通过以下方式轻松支持自动枚举:</p>
<pre><code>def enum(*sequential, **named):
enums = dict(zip(sequential, range(len(sequential))), **named)
return type('Enum', (), enums)
</code></pre>
<p>用起来像这样:</p>
<pre><code>>>> Numbers = enum('ZERO', 'ONE', 'TWO')
>>> Numbers.ZERO
0
>>> Numbers.ONE
1
</code></pre>
<p>可以通过以下方式添加对将值转换回名称的支持:</p>
<pre><code>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)
</code></pre>
<p>这将覆盖具有该名称的任何内容,但对于在输出中呈现枚举非常有用。如果反向映射不存在,它将抛出KeyError。举第一个例子:</p>
<pre><code>>>> Numbers.reverse_mapping['three']
'THREE'
</code></pre>