[Python] Comment obtenir une valeur avec une clé autre que value avec Enum

Comment obtenir une valeur avec une clé autre que value avec Enum

introduction

De nombreux langages de programmation ont quelque chose appelé Enum. C'est aussi en Python. Vous pouvez obtenir chaque «valeur» en tant que clé, mais vous ne pouvez obtenir aucune autre valeur en tant que clé. Je vais l'introduire car c'était possible en étendant le Enum normal.

Confirmation d'énumération normale

Voyons d'abord comment utiliser Enum normalement.

>>> from enum import Enum
>>>
>>> class Color(Enum):
...     RED = 1
...     GREEN = 2
...     BLUE = 3

#Si vous déclarez Enum comme ci-dessus
#Vous pouvez accéder à chaque membre en utilisant une valeur telle que 1 ou 2 comme clé.

>>> color = Color(1)
>>> print(color)
Color.RED

#Bien sûr, vous pouvez également y accéder directement
>>> print(Color.RED)
Color.RED
>>> print(color == Color.RED)
True

Chose que tu veux faire

Vous pouvez accéder à Color.RED avec Color (1), mais si vous pouvez accéder avec Color ('red') ʻet Color ('red') par exemple, les possibilités de ʻEnum s'élargiront.

>>> from enum import Enum
>>>
>>> class Color(Enum):
...     RED = 1
...     GREEN = 2
...     BLUE = 3

#Bien sûr, j'obtiens une erreur lorsque j'essaye d'accéder comme ci-dessous
>>> color = Color('red')
Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "/usr/local/lib/python3.6/enum.py", line 293, in __call__
    return cls.__new__(cls, value)
  File "/usr/local/lib/python3.6/enum.py", line 535, in __new__
    return cls._missing_(value)
  File "/usr/local/lib/python3.6/enum.py", line 548, in _missing_
    raise ValueError("%r is not a valid %s" % (value, cls.__name__))
ValueError: 'red' is not a valid Color

>>> color = Color('rouge')
Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "/usr/local/lib/python3.6/enum.py", line 293, in __call__
    return cls.__new__(cls, value)
  File "/usr/local/lib/python3.6/enum.py", line 535, in __new__
    return cls._missing_(value)
  File "/usr/local/lib/python3.6/enum.py", line 548, in _missing_
    raise ValueError("%r is not a valid %s" % (value, cls.__name__))
ValueError: 'rouge' is not a valid Color

la mise en oeuvre

Maintenant, vérifions l'implémentation d'Enum qui étend la clé.

#Au moment de la déclaration, comme suit`_value2member_map_`Mettre à jour
>>> from enum import Enum
>>>
>>> class Color(Enum):
...     def __new__(cls, value, en, ja):
...         obj = object.__new__(cls)
...         obj._value_ = value
...         cls._value2member_map_.update({en: obj, ja: obj})
...         return obj
...     RED = (1, 'red', 'rouge')
...     GREEN = (2, 'green', 'vert')
...     BLUE = (3, 'blue', 'Bleu')

#Avec ça comme avant'red'Ou'rouge'Lorsque vous accédez avec
>>> color = Color('red')
>>> print(color)
Color.RED

>>> red = Color('rouge')
>>> print(red)
Color.RED

finalement

Si vous en faites trop, la clé peut être usée, mais je pense que cela vaut la peine de le savoir. Il semble qu'il puisse être utilisé avec le type int dans DB et le type str dans l'API.

Recommended Posts

[Python] Comment obtenir une valeur avec une clé autre que value avec Enum
Comment démarrer avec Python
Comment extraire un index autre qu'un index spécifique avec Numpy
Comment obtenir la dernière (dernière) valeur d'une liste en Python
Comment obtenir stacktrace en python
Comment lire un fichier CSV avec Python 2/3
Zubu amateur veut démarrer Python
Comment obtenir la valeur du magasin de paramètres dans lambda (en utilisant python)
Comment convertir / restaurer une chaîne avec [] en python
[Python] Comment dessiner un graphique linéaire avec Matplotlib
Comment obtenir un utilisateur connecté avec les forms.py de Django
Comment obtenir plus de 1000 données avec SQLAlchemy + MySQLdb
Comment obtenir le verdict de la molette de la souris avec des malédictions Python
[Python] Comment créer un histogramme bidimensionnel avec Matplotlib
[Python] Comment dessiner un diagramme de dispersion avec Matplotlib
Comment obtenir une liste de fichiers dans le même répertoire avec python
[Introduction à Python] Comment obtenir l'index des données avec l'instruction for
Comment installer NPI + envoyer un message à la ligne avec python
Comment convertir un tableau en dictionnaire avec Python [Application]
J'ai essayé "Comment obtenir une méthode décorée en Python"
Comment vérifier si une valeur existe dans un type d'énumération
Comment créer un environnement de développement de la série Python2.7 avec Vagrant
Comment entrer dans l'environnement de développement Python avec Vagrant
Comment utiliser un fichier autre que .fabricrc comme fichier de configuration
[Introduction à Python] Comment obtenir des données avec la fonction listdir
Python: comment utiliser async avec
Comment obtenir la version Python
Comment démarrer avec Scrapy
Comment démarrer avec Django
Comment calculer la date avec python
Exécutez le programme sans créer d'environnement Python! !! (Comment démarrer avec Google Colaboratory)
Obtenir la valeur d'une clé spécifique jusqu'à l'index spécifié de la liste de dictionnaires en Python
Comment démarrer par lots un programme Python créé avec le notebook Jupyter
[Python 3.8 ~] Comment définir intelligemment des fonctions récursives avec des expressions lambda
[Python] Un mémo que j'ai essayé de démarrer avec asyncio
Comment obtenir une chaîne à partir d'un argument de ligne de commande en python
[Python] Comment obtenir et modifier les lignes / colonnes / valeurs d'une table.
J'ai essayé de résumer brièvement la procédure de démarrage du développement de Django
[ROS2] Comment lire un fichier bag avec le lancement au format python
Comment envoyer une requête à l'API DMM (FANZA) avec python
Comment obtenir l'identifiant du parent avec sqlalchemy
Comment ajouter un package avec PyCharm
[Python] Comment rendre une classe itérable
[Python] Comment convertir une liste bidimensionnelle en liste unidimensionnelle
Comment utiliser BigQuery en Python
[Python] Comment inverser une chaîne de caractères
Comment gérer les erreurs de compatibilité d'énumération
Comment faire un test de sac avec python
Comment afficher le japonais python avec lolipop
Comment entrer le japonais avec les malédictions Python
Comment les débutants en Python commencent avec Progete
Comment exécuter des scripts Maya Python
Comment installer python3 avec docker centos
[Python] Qu'est-ce qu'un argument formel? Comment définir la valeur initiale
[Yahoo! Weather Replacement Version] Comment obtenir des informations météo avec LINE Notify + Python