enum - obtendo valor de enum na conversão de string

108

Eu tenho o seguinte enum definido

from enum import Enum


class D(Enum):
    x = 1
    y = 2


print(D.x)

agora o valor impresso é

D.x

em vez disso, queria que o valor do enum fosse print

1

O que pode ser feito para obter essa funcionalidade?

Vaibhav Mishra
fonte
1
Devo esclarecer os parâmetros de acesso, eu conheço a coisa Dxvalue, o que eu quero é a conversão da string Dx para retornar o valor, desculpe se a pergunta não esclarecer a condição.
Vaibhav Mishra

Respostas:

188

Você está imprimindo o enum objeto . Use o .valueatributo se você quiser apenas imprimir:

print(D.x.value)

Veja o acesso programático a membros de enumeração e seus atributos seção :

Se você tiver um membro enum e precisar de seu nome ou valor:

>>>
>>> member = Color.red
>>> member.name
'red'
>>> member.value
1

Você pode adicionar um __str__ método ao seu enum, se tudo o que você quisesse fosse fornecer uma representação de string personalizada:

class D(Enum):
    def __str__(self):
        return str(self.value)

    x = 1
    y = 2

Demo:

>>> from enum import Enum
>>> class D(Enum):
...     def __str__(self):
...         return str(self.value)
...     x = 1
...     y = 2
... 
>>> D.x
<D.x: 1>
>>> print(D.x)
1
Martijn Pieters
fonte
Quando eu comparo com um valor inteiro, ele retorna como objeto. Ex: if D.x == 10: .... Qual abordagem devo adotar para inteiros?
sempre
@alper: exatamente da mesma maneira; D.xé o objeto enum, D.x.valueé um valor inteiro. Se você deve fazer com que os valores enum atuem como inteiros, use o IntEnumtipo , onde cada elemento é uma subclasse de inte, portanto IntEnumD.x == 10, funcionaria.
Martijn Pieters
Eu adicionei def __eq__(self, other): return int(self.value) == othere def __int__(self): return int(self.value)mas ainda acho que tenho de usar .valueem casos quando eu não usar comparando
alper
@alper: essa __eq__implementação não funciona quando otheré outro valor enum; D.x == D.y, onde D.x.value == D.y.valueseria verdade, falharia por exemplo. Parece que você deseja usar em IntEnumvez de Enumlá.
Martijn Pieters
7

Implementei o acesso usando o seguinte

class D(Enum):
    x = 1
    y = 2

    def __str__(self):
        return '%s' % self.value

agora eu posso apenas fazer

print(D.x)para obter 1como resultado.

Você também pode usar self.namecaso queira imprimir em xvez de 1.

Vaibhav Mishra
fonte
2
Por que a formatação da string e self._value_? return str(self.value)é mais direto.
Martijn Pieters
1
Acabei de olhar a fonte e foi assim que está implementado, porém você tem razão e self.valueestá mais limpo.
Vaibhav Mishra
3
Os atributos de sublinhado único são internos à classe enum gerada; melhor ficar com o atributo documentado (que passa a ser um descritor especial para que você ainda possa usar valuecomo um nome em seu tipo de enum).
Martijn Pieters
@MartijnPieters concordou
Vaibhav Mishra
0

Encontrei esta página ao pesquisar para acessar um Enumusando uma string. Eu sei que não é isso que está sendo perguntado nesta questão particular, mas o título "sugere" isso.

Para obter um Enum usando uma String, você pode fazer o seguinte:

from enum import Enum


class D(Enum):
    x = 1
    y = 2


print(D["x"])  # <D.x: 1>
Kerwin Sneijders
fonte