Python: Le module enum
Le module enum est très pratique pour créer et utiliser des constantes dans des programmes python.
Dans l'exemple suivant, je crée une classe qui va me permettre de générer des constantes pour les codes HTTP à l'aide de la classe Enum du module enum.
Cette classe pourra ensuite être utilisée dans n'importe quel programme ayant besoin d'utiliser ces codes.
Pour l'exemple, j'ai utilisé que quelques codes.
La liste complète étant disponible ici.
from enum import Enum
class Status(Enum):
HTTP_OK = 200
HTTP_CREATED = 201
HTTP_ACCEPTED = 202
HTTP_NON_AUTHORITATIVE = 203
HTTP_NO_CONTENT = 204
HTTP_PARTIAL_CONTENT = 206
HTTP_MULTIPLE_CHOICES = 300
HTTP_MOVED_PERMANENTLY = 301
HTTP_MOVED_TEMPORARILY = 302
HTTP_SEE_OTHER = 303
HTTP_NOT_MODIFIED = 304
HTTP_BAD_REQUEST = 400
HTTP_UNAUTHORIZED = 401
HTTP_PAYMENT_REQUIRED = 402
HTTP_FORBIDDEN = 403
HTTP_NOT_FOUND = 404
HTTP_METHOD_NOT_ALLOWED = 405
HTTP_INTERNAL_SERVER_ERROR = 500
HTTP_NOT_IMPLEMENTED = 501
HTTP_BAD_GATEWAY = 502
J'ai donc créé une classe Status qui étend la classe Enum du module enum.
Pour créer les constantes, il suffit juste de créer des paires clés / valeurs.
Les valeurs peuvent être numériques ou des chaines de caractères.
Pour utiliser cette classe personnalisée, il suffit de procéder de cette manière.
Pour l'exemple, je pars du principe que la classe Status est enregistrée dans un fichier nommé Apache.py et que ce fichier est disponible dans un répertoire listé dans la variable path du module sys.
>>> from Apache import Status
>>> Status
<enum 'Status'>
>>> Status(200)
<Status.HTTP_OK: 200>
>>> Status['HTTP_UNAUTHORIZED']
<Status.HTTP_UNAUTHORIZED: 401>
>>> Status.HTTP_BAD_REQUEST
<Status.HTTP_BAD_REQUEST: 400>
>>> Status(200).value
200
>>> Status(200).name
'HTTP_OK'
>>> Status['HTTP_OK'].value
200
On voit bien que la classe Status étend le module enum.
Pour afficher la description (le nom de la constante correspondante) d'un code, il suffit d'appeler la classe avec le code entre parenthèses.
Si le code n'existe pas, une exception "ValueError" est levée.
On peut également afficher l'information à l'aide du nom de la constante entre crochets (comme un dictionnaire).
Les constantes sont accessibles directement via la classe Status comme n'importe quelles constantes de classes ordinaires.
Il est également très facile d'obtenir la valeur d'une constante et/ou son nom que ce soit à partir de sa valeur ou de son nom.
Il est également possible d'ajouter des informations supplémentaires comme un label par exemple.
from enum import Enum
class Status(int, Enum):
HTTP_OK = (200, 'Ok')
HTTP_CREATED = (201, 'Created')
HTTP_ACCEPTED = (202, 'Accepted')
HTTP_NON_AUTHORITATIVE = (203, 'Non Authoritative')
HTTP_NO_CONTENT = (204, 'No Content')
HTTP_PARTIAL_CONTENT = (206, 'Partial Content')
HTTP_MULTIPLE_CHOICES = (300, 'Multiple Choices')
HTTP_MOVED_PERMANENTLY = (301, 'Moved Permanently')
HTTP_MOVED_TEMPORARILY = (302, 'Moved Temporarily')
HTTP_SEE_OTHER = (303, 'See Other')
HTTP_NOT_MODIFIED = (304, 'Not Modified')
HTTP_BAD_REQUEST = (400, 'Bad Request')
HTTP_UNAUTHORIZED = (401, 'Unauthorized')
HTTP_PAYMENT_REQUIRED = (402, 'Payment Required')
HTTP_FORBIDDEN = (403, 'Forbidden')
HTTP_NOT_FOUND = (404, 'Not Found')
HTTP_METHOD_NOT_ALLOWED = (405, 'Method Not Allowed')
HTTP_INTERNAL_SERVER_ERROR = (500, 'Internal Server Error')
HTTP_NOT_IMPLEMENTED = (501, 'Not Implemented')
HTTP_BAD_GATEWAY = (502, 'Bad Gateway')
def __new__(cls, value, label):
obj = int.__new__(cls, value)
obj._value_ = value
obj.label = label
return obj
Pour ajouter des labels par exemple, il est nécessaire de modifier la classe Status.
Il faut ajouter une dépendance à l'objet int.
Il faut ensuite modifier les valeurs en les remplaçant par des tuples contenant la valeur et le label.
Pour finir, il faut ajouter une fonction __new__ afin d'indiquer quelle valeur du tuple sera affectée à l'attribut _value_
La nouvelle classe est sauvegardée dans un fichier nommé HTTP_Status.py
Résultat:
from HTTP_Status import Status
Status
Out[3]: <enum 'Status'>
Status.HTTP_OK
Out[4]: <Status.HTTP_OK: 200>
Status.HTTP_OK.name
Out[5]: 'HTTP_OK'
Status.HTTP_OK.value
Out[6]: 200
Status.HTTP_OK.label
Out[7]: 'Ok'
Status.HTTP_NOT_FOUND
Out[8]: <Status.HTTP_NOT_FOUND: 404>
Status.HTTP_NOT_FOUND.name
Out[9]: 'HTTP_NOT_FOUND'
Status.HTTP_NOT_FOUND.value
Out[10]: 404
Status.HTTP_NOT_FOUND.label
Out[11]: 'Not Found'
Status(404)
Out[12]: <Status.HTTP_NOT_FOUND: 404>
Status(404).label
Out[13]: 'Not Found'
Status['HTTP_NOT_FOUND']
Out[14]: <Status.HTTP_NOT_FOUND: 404>
Status['HTTP_NOT_FOUND'].label
Out[15]: 'Not Found'
Status['HTTP_NOT_FOUND'].value
Out[16]: 404
Ajouter un commentaire