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.
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
Vous devez vous connecter pour publier un commentaire.
Eh bien, voici ce que vous avez demandé:
Mais je n'ai vraiment pas obtenir le point de Enums en Python. Il a un riche type de système ainsi que les générateurs et les coroutines pour gérer les états.
Je sais que je n'ai pas été à l'aide des Enums en Python pour les plus de 12 ans, peut-être que vous pouvez vous débarrasser d'eux aussi 😉
C'est parce que
range
commence à 0.tostring(2)
donneVAL3
. Malheureux noms (*[1-9]
). Autant que je sache, C/C++enum
commence à 0 aussi."tostring" et "fromsring" sont certainement javesque. Python n'a pas besoin de ces trucs.
Si les énumérations ne sont pas de toute utilisation en Python, c'est bizarre la façon dont beaucoup de gens ont senti le besoin de mettre en place quelque chose comme au cours des années. Une façon, personnellement, je les utiliser est de donner des noms à des choses comme des numéros de magie et de faire mes scripts plus descriptif et lisible.
Non seulement, c'est bizarre la façon dont beaucoup de gens ont senti le besoin de les mettre en œuvre; ils en quelque sorte retrouvé dans la bibliothèque standard! Clairement il y a un utilitaire pour eux.
OriginalL'auteur Jochen Ritzel
[Le temps passe...]
La nouvelle Python Enum a finalement atterri en 3.4, et a également été réalignés. Si la réponse à votre question est maintenant de les utiliser. 🙂
Un exemple:
OriginalL'auteur Ethan Furman
Utiliser un dict:
Pas de classes nécessaires. Dicts avoir votre classe battre parce que 1.) ils sont incroyablement efficace, 2.) avoir un tas de méthodes incroyable cuit, et 3.) sont un langage universel de construire. Ils sont également extensible:
Il n'est pas sage de mettre en œuvre C++ (ou autre langue), la fonctionnalité de Python. Si vous vous trouvez "le piratage d'un enum" ou quelque chose de cette nature, vous pouvez parier la ferme, vous ne le font pas le Python.
Si vous voulez aller à l'inverse, de manière à construire une autre dict. (par exemple,
{'1':'VAL1', ...}
L'extensibilité n'est pas une fonctionnalité pour les énumérations.
OriginalL'auteur Rafe Kettler
Voir:
Comment puis-je représenter un 'Enum' en Python?
Celui-ci est intéressant:
Utilisation:
C'est simple et léger. Sont-ils des inconvénients de cette approche?
EDIT:
Autant que je sache, les énumérations ne sont pas très pythonic en tant que concept, c'est pourquoi ils n'ont pas été mis en œuvre en premier lieu. Je n'ai jamais utilisé, et ne peuvent pas voir les cas d'utilisation pour en Python. Les énumérations sont utiles dans les langages à typage statique, parce qu'ils ne sont pas dynamiques 😉
OriginalL'auteur Paweł Prażak
Cela va faire ce que vous voulez et généralise votre application tout en réduisant légèrement la chaudière-plaque de code:
OriginalL'auteur martineau
Vous pouvez utiliser les dictionnaires:
Edit : THC4k réponses, c'est certainement mieux. Mais à gauche de la mine comme un exemple d'implémentation naïve.
Je vais prendre note de cela.
OriginalL'auteur Rod
Vous ne devriez pas avoir à coder en dur vos valeurs à l'intérieur de la classe - il vaut mieux avoir un énumérateur de l'usine.
Tout ça, c'est juste ajouter quelques nicetirs fournis par Python, par exemple, remplacer la represntation méthode ou un attribut:
Maintenant l'utiliser:
(btw, les gens dans le Python développeurs liste de parler de ce sujet,plus nous risquons de nous
plus complète, et avec suffisamment de fonctionnalités, la mise en œuvre de ce mode natif par Python 3.3)
OriginalL'auteur jsbueno