Versuchen Sie automatisch, Enum in Python 3.6 automatisch zu bewerten

C- oder VBA-Aufzählung

In C und VBA Enum kann der Wert jedes Mitglieds angegeben werden oder nicht, andernfalls ist es der Wert des vorherigen Mitglieds + 1. Das erste Mitglied ist 0, wenn kein Wert angegeben ist.

Persönlich verwende ich beim Umgang mit Eingabedateien wie CSV in VBA häufig den Aufzählungstyp, da es praktisch ist, die Felder der Datei zu identifizieren. Zum Beispiel sieht es wie folgt aus.

Public Enum FieldID

     OrderNo = 1
     CustomerNo
     PurchaseDate
     ProductID = 10
     Price
     Units
     Amount

End Enum

Wenn Sie eine kleine Anzahl von Elementen haben, wie in diesem Beispiel, werden Sie es vielleicht nicht zu schätzen wissen. Wenn Sie jedoch Felder in einer Datei mit Dutzenden von Spalten definieren, haben alle Mitglieder zusätzliche oder gelöschte Spalten. Dies ist praktisch, da Sie nicht neu nummerieren müssen.

Python 3.6 hat die Möglichkeit hinzugefügt, den Enum-Typ automatisch zu bewerten, daher habe ich versucht, dasselbe zu tun.

Python Enum

Python hat die Enum-Klasse in Version 3.4 zur Standardbibliothek hinzugefügt. Pythons Enum ist im Artikel hier gut zusammengefasst.

Wie Sie in der Enum Library Documentation sehen können, ist in Python 3.6 = auto () für die automatische Preisgestaltung von Enum. Der Ausdruck wurde hinzugefügt. (Eigentlich ist auto eine Klasse und ruft ihren Konstruktor auf.)

Ich habe das gleiche versucht wie der obige VBA-Code.

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))

Das Ausführungsergebnis ist

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

Es ist notwendig, "auto ()" zu schreiben, aber es scheint sich automatisch zu erhöhen, wie bei C und VBA. Wenn das erste Mitglied jedoch "= auto ()" ist, ist es 1 anstelle von 0.

In der Bibliotheksdokumentation wird jedoch darauf hingewiesen, dass dieses Inkrement implementierungsabhängig ist. Um dieses Verhalten dauerhaft zu machen, müssen Sie das Verhalten von auto () selbst definieren.

Der von "auto ()" zurückgegebene Wert kann mit der Methode "generate_next_value" angepasst werden. Erstellen Sie daher eine Klasse "AutoIntoEnum", die "IntEnum" erbt, und definieren Sie "generate_next_value" selbst.

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))

Dies ist auch dann in Ordnung, wenn sich die Implementierung von _generate_next_value_ ändert. Der Inhalt von _generate_next_value_ wird aus Enum-Klassencode kopiert und eingefügt.

Recommended Posts

Versuchen Sie automatisch, Enum in Python 3.6 automatisch zu bewerten
Versuchen Sie, Trace in Python zu berechnen
Versuchen Sie, sich mit Python bei qiita anzumelden
Versuchen Sie, sich mit Python auf Ihrem PC automatisch bei Netflix anzumelden
Versuchen Sie, Oni Mai Tsuji Miserable mit Python zu implementieren
Berechnen wir das statistische Problem mit Python
3,14 π Tag, versuchen Sie also, in Python auszugeben
Registrieren Sie Funktionsargumente automatisch in argparse in Python
Versuchen Sie, Python-Dokumente automatisch mit Sphinx zu generieren
Versuchen Sie, RPN mit Python zu berechnen (für Anfänger)
Versuchen Sie gRPC in Python
Probieren Sie 9 Slices in Python aus
Versuchen Sie, ein Python-Modul in C-Sprache zu erstellen
Versuchen Sie, Ihr eigenes Intro-Quiz mit Python zu verbessern
So löschen Sie stdout in Python
Versuchen Sie, Python selbst zu verstehen
Melden Sie sich auf der Website in Python an
Versuchen Sie LINE Notify mit Python
Sprechen mit Python [Text zu Sprache]
Lassen Sie uns Yuma in Python 3 implementieren
Wie man in Python entwickelt
Post an Slack in Python
Versuchen Sie es mit GUI, PyQt in Python
Versuchen Sie einfach, einen Webhook mit ngrok und Python zu erhalten
So melden Sie sich mit Python bei AtCoder an und senden automatisch
[Python] Wie man PCA mit Python macht
Konvertieren Sie Markdown in Python in PDF
So sammeln Sie Bilder in Python
Versuchen Sie, Facebook mit Python zu betreiben
Formatieren Sie Python-Code automatisch mit Vim
Verwendung von SQLite in Python
Versuchen Sie es mit LevelDB mit Python (plyvel)
Versuchen wir es mit Fizz Buzz mit Python
Im Python-Befehl zeigt Python auf Python3.8
Versuchen Sie den Zugriff auf das SPS-Register in Python
Versuchen Sie, Daten in MongoDB abzulegen
Versuchen Sie, die cloudmonkey-CLI in python3 -1 zu konvertieren
Wie man MySQL mit Python benutzt
So verpacken Sie C in Python
Verwendung von ChemSpider in Python
6 Möglichkeiten zum Stringen von Objekten in Python
Verwendung von PubChem mit Python
Probieren Sie Cython in kürzester Zeit aus
Versuchen Sie es mit LeapMotion mit Python
Umgang mit Japanisch mit Python
Eine Alternative zu "Pause" in Python
Versuchen Sie, die Thread-Liste der Nachrichten (Abneigung) mit Python zu erhalten.
Ich habe versucht, PLSA in Python zu implementieren
[Einführung in Python] Wie verwende ich eine Klasse in Python?
Versuchen Sie es mit der Wunderlist-API in Python
Installieren Sie Pyaudio, um Wellen in Python zu spielen
Ich habe versucht, Permutation in Python zu implementieren
Methode zum Erstellen einer Python-Umgebung in Xcode 6
Dynamisches Definieren von Variablen in Python
Versuchen Sie, die Kraken-API mit Python zu verwenden
So machen Sie R chartr () in Python
Versuchen Sie, mit Binärdaten in Python zu arbeiten