enum - obteniendo el valor de enum en la conversión de cadenas

108

Tengo la siguiente enumeración definida

from enum import Enum


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


print(D.x)

ahora el valor impreso es

D.x

en cambio, quería que el valor de la enumeración se imprimiera

1

¿Qué se puede hacer para lograr esta funcionalidad?

Vaibhav Mishra
fuente
1
Debo aclarar los parámetros de acceso, sé lo de Dxvalue, lo que quiero es que la conversión de cadena Dx devuelva el valor, lo siento si la pregunta no aclara la condición.
Vaibhav Mishra

Respuestas:

188

Está imprimiendo el objeto enum . Use el .valueatributo si solo desea imprimir eso:

print(D.x.value)

Consulte la sección Acceso programático a los miembros de la enumeración y sus atributos :

Si tiene un miembro enum y necesita su nombre o valor:

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

Puede agregar un __str__método a su enumeración, si todo lo que quisiera fuera proporcionar una representación de cadena personalizada:

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

    x = 1
    y = 2

Manifestación:

>>> 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
fuente
Cuando lo comparo con un valor entero, devuelve un objeto. Ej if D.x == 10: .... : . ¿Qué enfoque debo tomar para los números enteros?
alper
@alper: exactamente de la misma manera; D.xes el objeto enum, D.x.valuees un valor entero. Si debe hacer que los valores de enumeración actúen como números enteros, use el IntEnumtipo , donde cada elemento es una subclase de inty, por IntEnumD.x == 10lo tanto , funcionaría.
Martijn Pieters
He agregado def __eq__(self, other): return int(self.value) == othery def __int__(self): return int(self.value)todavía creo que tengo que usarlo .valueen casos en los que no uso la comparación
alper
@alper: esa __eq__implementación no funciona cuando otherhay otro valor de enumeración; D.x == D.y, donde D.x.value == D.y.valuesería cierto, fallaría por ejemplo. Parece que desea usar en IntEnumlugar de Enumallí.
Martijn Pieters
7

Implementé el acceso usando lo siguiente

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

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

ahora solo puedo hacer

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

También puede utilizarlo self.nameen caso de que desee imprimir en xlugar de 1.

Vaibhav Mishra
fuente
2
¿Por qué el formato de cadena y self._value_? return str(self.value)es más sencillo.
Martijn Pieters
1
Acabo de mirar la fuente y así es como se implementa, sin embargo, tiene razón y self.valuees más limpio.
Vaibhav Mishra
3
Los atributos de subrayado único son internos a la clase de enumeración generada; es mejor que se ciña al atributo documentado (que resulta ser un descriptor especial para que pueda usarlo valuecomo nombre en su tipo de enumeración).
Martijn Pieters
@MartijnPieters estuvo de acuerdo
Vaibhav Mishra
0

Encontré esta página cuando buscaba acceder a Enumuna cadena. Sé que esto no es lo que se pregunta en esta pregunta en particular, pero el título lo "sugiere".

Para obtener una enumeración usando una cadena, puede hacer lo siguiente:

from enum import Enum


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


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