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