En Python, un enum est un ensemble de noms uniques liés à des valeurs uniques et constantes.
Les Enums sont définis en héritant d'une classe Enum.
Les types d'enum natifs sont disponibles dans le module enum et la classe Enum peut être importée avec from enum import Enum.
from enum import Enum
class Color(Enum):
RED = 1
GREEN = 2
Note que les valeurs des membres d'un enum peuvent être de n'importe quel type de données, comme str, tuple, float, etc.
class Color(Enum):
RED = 'red'
GREEN = 'green'
Les Enums peuvent aussi être créés avec la syntaxe d'appel de fonction.
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
Lorsque l'on affecte la même valeur à deux membres d'un enum, le membre affecté en second devient un alias du premier. Il n'est pas permis d'utiliser le même nom pour deux membres différents d'un enum.
class Color(Enum):
RED = 1
GREEN = 2
ALIAS_OF_RED = 1
Color.ALIAS_OF_RED
#=> <Color.RED: 1>
On peut parcourir les membres de l'enum avec la syntaxe standard 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>)
Les membres d'un Enum peuvent être comparés avec is (opérateur d'identité) ou is not. Les opérateurs == ou != (opérateurs d'égalité) fonctionnent de la même manière :
a = Color.RED
a is Color.RED
#=> True
a == Color.RED
#=> True
Pour affecter des valeurs entières, la fonction auto() commence à 1 et définit automatiquement les valeurs suivantes.
class Shape(Enum):
CIRCLE = auto()
SQUARE = auto()
OVAL = auto()
Pour interdire la création d'alias (empêcher des valeurs dupliquées avec des noms différents), on peut utiliser le décorateur de classe @enum.unique.
@enum.unique
class Shape(Enum):
CIRCLE = 1
SQUARE = 2
TRIANGLE = 1
#=> ValueError: duplicate values found in <enum 'Shape'>: TRIANGLE -> CIRCLE
Pour accéder à un membre d'un enum pour une valeur donnée, on peut utiliser cette notation : <EnumName>(<value>).
g = Color(2)
g is Color.GREEN
#=> True
g
#=> <Color.GREEN: 2>
On peut écrire un Enum restreint personnalisé en héritant de la classe Enum avec n'importe quel mix-in ou type de données.
Par exemple :
class StrEnum(str, Enum):
pass
L'héritage de Enum n'est autorisé que si l'enum ne définit aucun membre.
Consulte le guide pratique d'enum et le recueil de recettes d'enum pour plus de détails et d'explications.