Essayez auto pour évaluer automatiquement Enum dans Python 3.6

Énumération C ou VBA

En C et VBA Enum, la valeur de chaque membre peut être spécifiée ou non, sinon ce sera la valeur du membre précédent + 1. Le premier membre sera 0 si aucune valeur n'est spécifiée.

Personnellement, lorsque je traite des fichiers d'entrée tels que CSV dans VBA, j'utilise souvent le type Enum car il est pratique d'identifier les champs du fichier. Par exemple, cela ressemble à ce qui suit.

Public Enum FieldID

     OrderNo = 1
     CustomerNo
     PurchaseDate
     ProductID = 10
     Price
     Units
     Amount

End Enum

Si vous avez un petit nombre d'éléments, comme dans cet exemple, vous ne l'apprécierez peut-être pas, mais si vous définissez des champs dans un fichier contenant des dizaines de colonnes, tous les membres auront des colonnes supplémentaires ou supprimées Ceci est pratique car vous n'avez pas besoin de renuméroter.

Python 3.6 a ajouté la possibilité de valoriser automatiquement le type Enum, j'ai donc essayé de faire de même.

Énumération Python

Python a ajouté la classe Enum à la bibliothèque standard dans la version 3.4. L'Enum de Python est bien résumé dans l'article ici.

Comme vous pouvez le voir dans la Documentation de la bibliothèque Enum, dans Python 3.6, = auto () pour la tarification automatique Enum. L'expression «a été ajoutée. (En fait, ʻauto est une classe et appelle son constructeur.)

J'ai essayé la même chose que le code VBA ci-dessus.

from enum import IntEnum, auto

class Field(IntEnum):

   OrderNo = 1
   CustomerNo = auto()
   PurchaseDate = auto()
   ProductID = 10
   Price = auto()
   Units = auto()
   Amount = auto()

for elm in Field:
   print(elm, int(elm))

Le résultat de l'exécution est

Field.OrderNo 1
Field.CustomerNo 2
Field.PurchaseDate 3
Field.ProductID 10
Field.Price 11
Field.Units 12
Field.Amount 13

Il est nécessaire d'écrire ʻauto () , mais il semble s'incrémenter automatiquement comme C et VBA. Cependant, si le premier membre est = auto ()`, ce sera 1 au lieu de 0.

Cependant, la documentation de la bibliothèque indique que cet incrément dépend de l'implémentation. Pour rendre ce comportement permanent, vous devez définir vous-même le comportement de ʻauto () `.

La valeur retournée par ʻauto () peut être personnalisée avec la méthode generate_next_value, donc créez une classe ʻAutoIntoEnum qui hérite de ʻIntEnum et définissez generate_next_value` vous-même.

from enum import IntEnum, auto

class AutoIntEnum(IntEnum):

    def _generate_next_value_(name, start, count, last_values):
        for last_value in reversed(last_values):
            try:
                return last_value + 1
            except TypeError:
                pass
        else:
            return start

class Field(AutoIntEnum):

    OrderNo = auto()
    CustomerNo = auto()
    PurchaseDate = auto()
    ProductID = 10
    Price = auto()
    Units = auto()
    Amount = auto()

for elm in Field:
    print(elm, int(elm))

C'est OK même si l'implémentation de _generate_next_value_ change. Le contenu de _generate_next_value_ est copié et collé depuis Code of Enum class.

Recommended Posts

Essayez auto pour évaluer automatiquement Enum dans Python 3.6
Essayez de calculer Trace en Python
Essayez de vous connecter à qiita avec Python
Essayez de vous connecter automatiquement à Netflix en utilisant python sur votre PC
Essayez d'implémenter Oni Mai Tsuji Miserable avec python
Calculons en fait le problème statistique avec Python
3.14 π jour, alors essayez de sortir en Python
Enregistrer automatiquement les arguments de fonction dans argparse en Python
Essayez de générer automatiquement des documents Python avec Sphinx
Essayez de calculer RPN avec Python (pour les débutants)
Essayez gRPC en Python
Essayez 9 tranches en Python
Essayez de créer un module Python en langage C
Essayez d'améliorer votre propre quiz d'introduction avec Python
Pour vider stdout en Python
Essayez de comprendre Python soi
Connectez-vous au site Web en Python
Essayez LINE Notify avec Python
Parler avec Python [synthèse vocale]
Implémentons Yuma dans Python 3
Comment développer en Python
Publier sur Slack en Python
Essayez de le faire avec GUI, PyQt en Python
Essayez simplement de recevoir un webhook avec ngrok et Python
Comment se connecter à AtCoder avec Python et soumettre automatiquement
[Python] Comment faire PCA avec Python
Convertir Markdown en PDF en Python
Comment collecter des images en Python
Essayez d'exploiter Facebook avec Python
Formater automatiquement le code Python avec Vim
Comment utiliser SQLite en Python
Essayez d'utiliser LevelDB avec Python (plyvel)
Essayons Fizz Buzz avec Python
Dans la commande python, python pointe vers python3.8
Essayez l'accès au registre PLC en Python
Essayez de mettre des données dans MongoDB
Essayez de convertir la CLI cloudmonkey en python3 -1
Comment utiliser Mysql avec python
Comment envelopper C en Python
Comment utiliser ChemSpider en Python
6 façons d'enchaîner des objets en Python
Comment utiliser PubChem avec Python
Essayez Cython dans les plus brefs délais
Essayez d'utiliser LeapMotion avec Python
Comment gérer le japonais avec Python
Une alternative à `pause` en Python
Essayez d'obtenir la liste des fils du bulletin d'information (je n'aime pas) avec Python.
J'ai essayé d'implémenter PLSA en Python
[Introduction à Python] Comment utiliser la classe en Python?
Essayez d'utiliser l'API Wunderlist en Python
Installez Pyaudio pour lire des vagues en python
J'ai essayé d'implémenter la permutation en Python
Méthode pour créer un environnement Python dans Xcode 6
Comment définir dynamiquement des variables en Python
Essayez d'utiliser l'API Kraken avec Python
Comment faire R chartr () en Python
Essayez de travailler avec des données binaires en Python