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?
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:
È 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]
a = [(int(v), str(v)) for v in Color]
e poi print(a)
.
[(color.value, color.name) for color in Color]
Puoi fare quanto segue:
[e.value for e in Color]
list(Color)
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')]
@classmethod
sarebbe necessario creare un'istanza di Color
classe. Ecco perché staticmethod
sembra essere la scelta corretta qui.
@classmethod
e utilizzare return list(map(lambda c: c.value, cls))
invece.
Basato sulla risposta di @Jeff, refactored per usare a in classmethod
modo 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']
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}
Quindi Enum
ha 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.
__members__
? Sarebbe un modo interessante per consentire le estensioni creando così nuovi Enum
membri. ... tra l'altro, votato per aver portato un nuovo attributo ( per me ) nella tabella.
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
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)