Em Python, um enum é um conjunto de nomes únicos associados a valores únicos e constantes.
Os Enums são definidos por herança de uma classe Enum.
Os tipos de enum nativos estão disponíveis no módulo enum, e a classe Enum pode ser importada com from enum import Enum.
from enum import Enum
class Color(Enum):
RED = 1
GREEN = 2
Repare que os valores dos membros de um enum podem ser de qualquer tipo de dado, como str, tuple, float, etc.
class Color(Enum):
RED = 'red'
GREEN = 'green'
Os Enums também podem ser criados com a sintaxe de chamada de função.
from enum import Enum
Animal = Enum('Animal', 'ANT BEE CAT DOG')
list(Animal)
#=> [<Animal.ANT: 1>, <Animal.BEE: 2>, <Animal.CAT: 3>, <Animal.DOG: 4>]
Animal.ANT.value
#=> 1
Quando você atribui o mesmo valor a dois membros de um enum, o segundo membro atribuído vira um alias do primeiro. Não é permitido usar o mesmo nome para dois membros diferentes de um enum.
class Color(Enum):
RED = 1
GREEN = 2
ALIAS_OF_RED = 1
Color.ALIAS_OF_RED
#=> <Color.RED: 1>
É possível iterar sobre os membros do enum com a sintaxe padrão for member in:
for member in Color:
print((member.name, member.value))
#=> (RED, 1)
#=> (GREEN, 2)
# __members__.items() helps you to loop through alias as well
for member in Color.__members__.items():
print(member)
#=> ('RED', <Color.RED: 1>)
#=> ('GREEN', <Color.GREEN: 2>)
#=> ('ALIAS_OF_RED', <Color.RED: 1>)
Os membros de um Enum podem ser comparados com is (operador de identidade) ou is not. Os operadores == e != (operadores de igualdade) funcionam da mesma forma:
a = Color.RED
a is Color.RED
#=> True
a == Color.RED
#=> True
Para atribuir valores inteiros, a função auto() começa com 1 e define automaticamente os valores seguintes.
class Shape(Enum):
CIRCLE = auto()
SQUARE = auto()
OVAL = auto()
Para proibir aliases (evitando valores duplicados com nomes diferentes), use o decorador de classe @enum.unique.
@enum.unique
class Shape(Enum):
CIRCLE = 1
SQUARE = 2
TRIANGLE = 1
#=> ValueError: duplicate values found in <enum 'Shape'>: TRIANGLE -> CIRCLE
Para acessar um membro do enum a partir de um valor, use esta notação: <EnumName>(<value>).
g = Color(2)
g is Color.GREEN
#=> True
g
#=> <Color.GREEN: 2>
É possível escrever um Enum restrito personalizado criando uma subclasse da classe Enum com qualquer mix-in ou tipo de dado.
Por exemplo:
class StrEnum(str, Enum):
pass
Só é permitido criar subclasses de Enum se o enum não definir nenhum membro.
Consulte o how-to do enum e o cookbook do enum para mais detalhes e explicações.