问题

我主要是一个C#开发人员,但我目前正在使用一个Python项目.

如何在Python中表示相当于一个枚举?



解决方法

枚举已添加到Python 3.4,如 PEP 435 中所述.它也已回溯到3.3,3.2,3.1,2.7,2.6,2.5和2.4 pypi.

有关更高级的Enum技术,请尝试 aenum库(2.7,3.3+,作者与 enum34 .代码在py2和py3之间不完全兼容,例如,您需要 __ order __ in python 2 ).

  • To use enum34, do $ pip install enum34
  • To use aenum, do $ pip install aenum

安装枚举(无数字)会安装完全不同的不兼容版本.


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)

或等同于:

class Animal(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)

这将覆盖任何与该名称,但它是有用的渲染你的枚举输出.如果反向映射不存在,它将抛出KeyError.使用第一个示例:

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



相关问题推荐