2017-04-04 2 views
4

J'essaie d'obtenir le nom d'un ENUM donné l'un de ses multiples valeurs:Obtenir le nom Enum à partir de plusieurs valeurs python

class DType(Enum): 
    float32 = ["f", 8] 
    double64 = ["d", 9] 

lorsque je tente d'obtenir une valeur donnant le nom cela fonctionne:

print DType["float32"].value[1] # prints 8 
print DType["float32"].value[0] # prints f 

mais lorsque je tente d'obtenir le nom d'un valeur donnée que les erreurs viennent:

print DataType(8).name 
print DataType("f").name 

raise ValueError("%s is not a valid %s" % (value, cls.name))

ValueError: 8 is not a valid DataType

ValueError: f is not a valid DataType

Y at-il un moyen de faire cela? ou est-ce que j'utilise la mauvaise structure de données?

+0

Les énumérations ne peuvent pas avoir plusieurs valeurs par nom. Pourquoi avez-vous besoin de cela, est-ce un de ces alias? Quand utiliserait "f" et quand "9"? –

Répondre

3

La façon la plus simple est d'utiliser la bibliothèque aenum , qui ressemblerait à ceci:

from aenum import MultiValueEnum 

class DType(MultiValueEnum): 
    float32 = "f", 8 
    double64 = "d", 9 

et utilisation:

>>> DType("f") 
<DType.float32: 'f'> 

>>> DType(9) 
<DType.double64: 'd'> 

Comme vous pouvez le voir, la première valeur indiquée est la valeur canonique, et apparaît dans le repr().

Si vous voulez que toutes les valeurs possibles de se présenter, ou besoin d'utiliser le stdlib Enum (Python 3.4+), le answer found here est la base de ce que vous voulez (et travaillera également avec aenum):

class DType(Enum): 
    float32 = "f", 8 
    double64 = "d", 9 

    def __new__(cls, *values): 
     obj = object.__new__(cls) 
     # first value is canonical value 
     obj._value_ = values[0] 
     for other_value in values[1:]: 
      cls._value2member_map_[other_value] = obj 
     obj._all_values = values 
     return obj 

    def __repr__(self): 
     return '<%s.%s: %s>' % (
       self.__class__.__name__, 
       self._name_, 
       ', '.join([repr(v) for v in self._all_values]), 
       ) 

et utilisation:

>>> DType("f") 
<DType.float32: 'f', 8> 

>>> Dtype(9) 
<DType.float32: 'f', 9> 

Divulgation: Je suis l'auteur du Python stdlib Enum, le enum34 backport et la bibliothèque Advanced Enumeration (aenum).

+0

exactement ce que je cherchais. Merci beaucoup – Ruvalcaba

+0

@Ruvalcaba: Heureux d'aider. Quand une réponse fonctionne pour vous, vous devez l'accepter (cliquez sur la coche verte en fonction du score de cette réponse). –

+0

il suffit de changer l'importation: de aenum importation MultiValueEnum classe DType (MultiValueEnum): float32 = "f", 8 double64 = "d", 9 – epinal