Double Possible:
Comment puis-je représenter un 'enum' en Python?Quelle est la pratique courante pour les enums en Python? I. e. comment sont-ils répliqué en Python?
public enum Materials { Shaded, Shiny, Transparent, Matte }
- Comment puis-je représenter un 'Enum' en Python ? (5 réponses )
Réponses
Trop de publicités?J'ai vu ce modèle plusieurs fois:
>>> class Enumeration(object):
def __init__(self, names): # or *names, with no .split()
for number, name in enumerate(names.split()):
setattr(self, name, number)
>>> foo = Enumeration("bar baz quux")
>>> foo.quux
2
Vous pouvez aussi utiliser les membres de la classe, si vous aurez à fournir votre propre numérotation:
>>> class Foo(object):
bar = 0
baz = 1
quux = 2
>>> Foo.quux
2
Si vous êtes à la recherche de quelque chose de plus robuste (sparse valeurs enum-exception spécifique, etc.), essayez cette recette.
Je n'ai aucune idée pourquoi les Énumérations sont pas en charge nativement par Python. Le meilleur moyen que j'ai trouvé à l'imiter est par overridding _ str _ et _ eq _ de sorte que vous pouvez les comparer et lorsque vous utilisez print() vous bénéficiez de la chaîne, au lieu de la valeur numérique.
class enumSeason():
Spring = 0
Summer = 1
Fall = 2
Winter = 3
def __init__(self, Type):
self.value = Type
def __str__(self):
if self.value == enumSeason.Spring:
return 'Spring'
if self.value == enumSeason.Summer:
return 'Summer'
if self.value == enumSeason.Fall:
return 'Fall'
if self.value == enumSeason.Winter:
return 'Winter'
def __eq__(self,y):
return self.value==y.value
Utilisation:
>>> s = enumSeason(enumSeason.Spring)
>>> print(s)
Spring
Vous pourriez probablement utiliser une structure d'héritage, bien que le plus que j'ai joué avec cette la plus sale que j'ai ressenti.
class AnimalEnum:
@classmethod
def verify(cls, other):
return issubclass(other.__class__, cls)
class Dog(AnimalEnum):
pass
def do_something(thing_that_should_be_an_enum):
if not AnimalEnum.verify(thing_that_should_be_an_enum):
raise OhGodWhy