Tracce
/
Python
Python
/
Programma
/
Enumerazioni
En

Enumerazioni in Python

1 esercizio

Informazioni su Enumerazioni

In Python, un enum è un insieme di nomi unici a cui sono associati valori unici e costanti. Gli Enums si definiscono ereditando una classe Enum. I tipi enum integrati sono disponibili nel modulo enum e la classe Enum si può importare con from enum import Enum.

from enum import Enum

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

Nota che i valori dei membri di un enum possono essere di qualsiasi tipo di dato, come str, tuple, float, ecc.

class Color(Enum):
    RED = 'red'
    GREEN = 'green'

Gli Enums si possono anche creare usando la sintassi di chiamata di funzione.

from enum import Enum

Animal = Enum('Animal', 'ANT BEE CAT DOG')
list(Animal)
#=> [<Animal.ANT: 1>, <Animal.BEE: 2>, <Animal.CAT: 3>, <Animal.DOG: 4>]

Animal.ANT.value
#=> 1

Quando si assegna lo stesso valore a due membri di un enum, il membro assegnato per secondo diventa un alias del primo. Non è consentito usare lo stesso nome per due membri diversi di un enum.

class Color(Enum):
    RED = 1
    GREEN = 2
    ALIAS_OF_RED = 1

Color.ALIAS_OF_RED
#=> <Color.RED: 1>

Per iterare tra i membri di un enum si può usare la sintassi standard for member in:

for member in Color:
    print((member.name, member.value))
#=> (RED, 1)
#=> (GREEN, 2)

# __members__.items() helps you to loop through alias as well
for member in Color.__members__.items():
    print(member)
#=> ('RED', <Color.RED: 1>)
#=> ('GREEN', <Color.GREEN: 2>)
#=> ('ALIAS_OF_RED', <Color.RED: 1>)

I membri di un Enum si possono confrontare usando is (operatore di identità) o is not. Gli operatori == o != (operatori di uguaglianza) funzionano allo stesso modo:

a = Color.RED

a is Color.RED
#=> True

a == Color.RED
#=> True

Per assegnare valori interi, la funzione auto() parte da 1 e imposta automaticamente i valori successivi.

class Shape(Enum):
    CIRCLE = auto()
    SQUARE = auto()
    OVAL = auto()

Per vietare l'aliasing (impedire valori duplicati con nomi diversi), si può usare il decoratore di classe @enum.unique.

@enum.unique
class Shape(Enum):
    CIRCLE = 1
    SQUARE = 2
    TRIANGLE = 1
#=> ValueError: duplicate values found in <enum 'Shape'>: TRIANGLE -> CIRCLE

Per accedere a un membro di un enum dato un certo valore, si può usare questa notazione: <EnumName>(<value>).

g = Color(2)

g is Color.GREEN
#=> True

g
#=> <Color.GREEN: 2>

Si può scrivere un Enum limitato personalizzato ereditando dalla classe Enum con qualsiasi mix-in o tipo di dato. Per esempio:

class StrEnum(str, Enum):
    pass

Ereditare da Enum è consentito solo se l'enum non definisce alcun membro. Vedi la guida a enum e il cookbook di enum per maggiori dettagli e spiegazioni.

Modifica tramite GitHub Il collegamento si apre in una nuova finestra o scheda