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