153 votes

Quelle est la pratique courante pour les enums en Python?

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
}

375voto

Van Gale Points 21982
class Materials:
    Shaded, Shiny, Transparent, Matte = range(4)

>>> print Materials.Matte
3

21voto

Ben Blank Points 21786

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.

9voto

Spell Points 41

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

6voto

Trey Stout Points 1593

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X