Come ottenere tutti i valori dalla classe enum di Python?


140

Sto usando la libreria Enum4 per creare una classe enum come segue:

class Color(Enum):
    RED = 1
    BLUE = 2

Voglio stampare [1, 2]come un elenco da qualche parte. Come posso raggiungere questo obiettivo?

Risposte:


48

È possibile utilizzare IntEnum :

from enum import IntEnum

class Color(IntEnum):
   RED = 1
   BLUE = 2


print(int(Color.RED))   # prints 1

Per ottenere l'elenco degli ints:

enum_list = list(map(int, Color))
print(enum_list) # prints [1, 2]

Ne usi uno di terze parti. Ma dice anche che ha intenum
Marcin

Come faccio a stampare come [(1, 'ROSSO'), (2, 'BLU')]
user1159517

Che dire di questo: a = [(int(v), str(v)) for v in Color]e poi print(a).
Marcin

34
Che ne dici di questo:[(color.value, color.name) for color in Color]
vlad-ardelean,

2
Il commento di vlad-ardelean è il migliore e il più pitonico. È un uso idiomatico del tipo Enum, elegante ed eminentemente leggibile
dusktreader

431

Puoi fare quanto segue:

[e.value for e in Color]

1
@ user2340939 Restituisce l'elenco di enumerazioni, non l'elenco di valori. Se sei d'accordo, potresti anche usarelist(Color)
endolith

1
Questo dovrebbe essere contrassegnato come la risposta corretta.
SKYFALL26,

22

Per usare Enum con qualsiasi tipo di valore, prova questo:
Aggiornato con alcuni miglioramenti ... Grazie @Jeff, dal tuo consiglio!

from enum import Enum

class Color(Enum):
    RED = 1
    GREEN = 'GREEN'
    BLUE = ('blue', '#0000ff')

    @staticmethod
    def list():
        return list(map(lambda c: c.value, Color))

print(Color.list())

Come risultato:

[1, 'GREEN', ('blue', '#0000ff')]

6
Vorrei usare @classmethod invece di @ staticmethod
ISONecroMAn il

1
@ISONecroMAn Immagino che @classmethodsarebbe necessario creare un'istanza di Colorclasse. Ecco perché staticmethodsembra essere la scelta corretta qui.
Leonid Dashko,

@LeonidDashko per niente. Vedi la mia risposta
blueFast,

@LeonidDashko @dangoonfast è corretto. È possibile utilizzare @classmethode utilizzare return list(map(lambda c: c.value, cls))invece.
Riptyde4,

18

Basato sulla risposta di @Jeff, refactored per usare a in classmethodmodo da poter riutilizzare lo stesso codice per qualsiasi enumerazione:

from enum import Enum

class ExtendedEnum(Enum):

    @classmethod
    def list(cls):
        return list(map(lambda c: c.value, cls))

class OperationType(ExtendedEnum):
    CREATE = 'CREATE'
    STATUS = 'STATUS'
    EXPAND = 'EXPAND'
    DELETE = 'DELETE'

print(OperationType.list())

produce:

['CREATE', 'STATUS', 'EXPAND', 'DELETE']

7

class enum.Enumè una classe che risolve tutte le tue esigenze di enumerazione, quindi devi solo ereditare da essa e aggiungere i tuoi campi. Quindi da allora in poi, tutto ciò che devi fare è solo chiamare i suoi attributi: name& value:

from enum import Enum

class Letter(Enum):
   A = 1
   B = 2
   C = 3

print({i.name: i.value for i in Letter})
# prints {'A': 1, 'B': 2, 'C': 3}

6

Quindi Enumha un __members__dict. La soluzione proposta da @ozgur è davvero la migliore, ma puoi farlo, il che fa la stessa cosa, con più lavoro

[color.value for color_name, color in Color.__members__.items()]

Il __members__ dizionario potrebbe tornare utile se si desidera inserire roba dinamicamente in esso ... in una situazione folle.

[EDIT] Apparentemente __members__non è un dizionario, ma un proxy di mappa. Ciò significa che non è possibile aggiungere facilmente elementi ad esso.

Puoi comunque fare cose strane come MyEnum.__dict__['_member_map_']['new_key'] = 'new_value', e quindi puoi usare la nuova chiave come MyEnum.new_key.... ma questo è solo un dettaglio di implementazione e non dovrebbe essere giocato. La magia nera viene pagata con enormi costi di manutenzione.


Solo una barra laterale: è possibile aggiungere elementi __members__? Sarebbe un modo interessante per consentire le estensioni creando così nuovi Enummembri. ... tra l'altro, votato per aver portato un nuovo attributo ( per me ) nella tabella.
Estratto del

@IAbstract: No, non è consentito. Se qualcuno trova un modo per aggiungere / sottrarre membri dopo la creazione dell'Enum, probabilmente lo romperà.
Ethan Furman,

@IAbstract: aggiungere nuovi membri dopo che il fatto non è di solito una buona idea. Se vuoi davvero, dai un'occhiata a questa risposta .
Ethan Furman,

1

Utilizzare _member_names_per un risultato semplice e rapido se sono solo i nomi, ad es

Color._member_names_

Inoltre, hai _member_map_quale restituisce un dizionario ordinato degli elementi. Questa funzione restituisce a collections.OrderedDict, quindi hai Color._member_names_.items()e Color._member_names_.values()con cui giocare. Per esempio

return list(map(lambda x: x.value, Color._member_map_.values()))

restituirà tutti i valori validi di Colore


-1

puoi usare la funzione iter ():

from enum import IntEnum

class Color(IntEnum):
   RED = 1
   BLUE = 2
l=[]
for i in iter(Color):
    l.append(i.value)
print(l)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.