Percursos
/
Python
Python
/
Programa
/
Enumerações
En

Enumerações em Python

1 exercício

Sobre Enumerações

Em Python, um enum é um conjunto de nomes únicos associados a valores únicos e constantes. Os Enums definem-se por herança de uma classe Enum. Os tipos de enum incorporados 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

Repara que os valores dos membros do enum podem ser quaisquer tipos de dados, 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 se atribui o mesmo valor a dois membros de um enum, o membro atribuído em segundo lugar passa a ser 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>

Podes iterar pelos membros do enum com a sintaxe habitual 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 em 1 e define automaticamente os valores seguintes.

class Shape(Enum):
    CIRCLE = auto()
    SQUARE = auto()
    OVAL = auto()

Para proibir o uso de alias (impedir valores duplicados com nomes diferentes), podes usar o decorador @enum.unique, que é um decorador de classe.

@enum.unique
class Shape(Enum):
    CIRCLE = 1
    SQUARE = 2
    TRIANGLE = 1
#=> ValueError: duplicate values found in <enum 'Shape'>: TRIANGLE -> CIRCLE

Para aceder a um membro do enum a partir de um determinado valor, podes usar esta notação: <EnumName>(<value>).

g = Color(2)

g is Color.GREEN
#=> True

g
#=> <Color.GREEN: 2>

Podes escrever um Enum restrito personalizado ao criar uma subclasse da classe Enum com qualquer mix-in ou tipo de dados. Por exemplo:

class StrEnum(str, Enum):
    pass

Só podes criar subclasses de Enum se o enum não definir quaisquer membros. Consulta o guia prático do enum e o receituário do enum para mais detalhes e explicações.

Editar via GitHub A ligação abre numa nova janela ou separador