Python Enum class (avec tostring fromstring)

J'ai trouvé une façon simple à mettre en œuvre(hack) un enum en Python:

class MyEnum:
  VAL1, VAL2, VAL3 = range(3)

Je peux appeler cela ainsi:

bob = MyEnum.VAL1

Sexy!

Bien, maintenant, je veux être en mesure d'obtenir la valeur numérique si une chaîne de caractères ou une chaîne de caractères, si, étant donné une valeur numérique. Disons que je veux les cordes pour correspondre exactement à la clé Enum est

Du mieux que je pouvais penser, c'est quelque chose comme ceci:

class MyEnum:
  VAL1, VAL2, VAL3 = range(3)
  @classmethod
  def tostring(cls, val):
    if (val == cls.VAL1):
      return "VAL1"
    elif (val == cls.VAL2):
      return "VAL2"
    elif (val == cls.VAL3):
      return "VAL3"
    else:
      return None
  @classmethod
  def fromstring(cls, str):
    if (str.upper() == "VAL1"):
      return cls.VAL1
    elif (str.upper() == "VAL2"):
      return cls.VAL2
    elif (str.upper() == "VAL2"):
      return cls.VAL2
    else:
      return None

ou quelque chose comme ça (ignore comment je suis attraper invalide cas)

Est-il un meilleur, plus python centrée sur le moyen de faire ce que je fais ci-dessus? Ou est déjà au-dessus aussi concis qu'il obtient.

Il semble que il doit y avoir une meilleure façon de le faire.

Ce montant de if/else indique toujours que c'est une mauvaise solution 😉
double possible de What est la meilleure façon de mettre en œuvre un 'enum' en Python?
vous pouvez modifier votre réponse.

OriginalL'auteur Nick | 2010-12-17