如何用Python表示等效的枚举?
如PEP 435中所述,将枚举添加到Python 3.4中。它也已在pypi上反向移植到 3.3、3.2、3.1、2.7、2.6、2.5 和2.4。
3.3、3.2、3.1、2.7、2.6、2.5
2.4
对于更高级的Enum技术,请尝试aenum库(2.7、3.3+,与作者相同enum34。py2和py3之间的代码并不完全兼容,例如,__order__在python 2中需要)。
__order__
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'
我喜欢保持简单(我在网上看到了一些非常复杂的示例),就像这样…
class Animal: DOG = 1 CAT = 2 x = Animal.DOG
在Python 3.4(PEP 435)中,你可以将Enum设为基类。这会给你带来一些额外的功能,如PEP中所述。例如,枚举成员与整数不同,它们由a name和a 组成value。
class Animal(Enum): DOG = 1 CAT = 2 print(Animal.DOG) # <Animal.DOG: 1> print(Animal.DOG.value) # 1 print(Animal.DOG.name) # "DOG"
如果你不想键入值,请使用以下快捷方式:
class Animal(Enum): DOG, CAT = range(2)
Enum实现可以转换为列表并且可以迭代。其成员的顺序是声明顺序,与它们的值无关。例如:
class Animal(Enum): DOG = 1 CAT = 2 COW = 0 list(Animal) # [<Animal.DOG: 1>, <Animal.CAT: 2>, <Animal.COW: 0>] [animal.value for animal in Animal] # [1, 2, 0] Animal.CAT in Animal # True