Διαδρομές
/
Python
Python
/
Ύλη
/
Απαριθμήσεις
Απ

Απαριθμήσεις σε Python

1 άσκηση

Σχετικά με την έννοια Απαριθμήσεις

Στην Python, ένα enum είναι ένα σύνολο από μοναδικά ονόματα που είναι δεσμευμένα σε μοναδικές, σταθερές τιμές. Τα Enums ορίζονται κληρονομώντας μια κλάση Enum. Οι ενσωματωμένοι τύποι enum είναι διαθέσιμοι στο module enum και η κλάση Enum μπορεί να εισαχθεί με from enum import Enum.

from enum import Enum

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

Σημείωσε ότι οι τιμές των μελών του enum μπορούν να είναι οποιουδήποτε τύπου δεδομένων, όπως str, tuple, float, κ.λπ.

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

Τα Enums μπορούν επίσης να δημιουργηθούν με σύνταξη κλήσης συνάρτησης.

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

Όταν αντιστοιχίζεις την ίδια τιμή σε δύο μέλη ενός enum, το μέλος που αντιστοιχίζεται τελευταίο γίνεται alias του πρώτου. Δεν επιτρέπεται να χρησιμοποιήσεις το ίδιο όνομα για δύο διαφορετικά μέλη ενός enum.

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

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

Η επανάληψη στα μέλη του enum μπορεί να γίνει με τη βασική σύνταξη 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>)

Τα μέλη του Enum μπορούν να συγκριθούν με τον is (τελεστή ταυτότητας) ή το is not. Οι == ή != (τελεστές ισότητας) λειτουργούν με τον ίδιο τρόπο:

a = Color.RED

a is Color.RED
#=> True

a == Color.RED
#=> True

Για να αντιστοιχίσεις ακέραιες τιμές, η συνάρτηση auto() ξεκινά με 1 και ορίζει αυτόματα τις επόμενες τιμές.

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

Για να απαγορεύσεις το aliasing (να αποτρέψεις διπλότυπες τιμές με διαφορετικά ονόματα), μπορείς να χρησιμοποιήσεις τον διακοσμητή κλάσης @enum.unique.

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

Για να προσπελάσεις ένα μέλος του enum για μια δεδομένη τιμή, μπορείς να χρησιμοποιήσεις αυτή τη σημειογραφία: <EnumName>(<value>).

g = Color(2)

g is Color.GREEN
#=> True

g
#=> <Color.GREEN: 2>

Ένα προσαρμοσμένο περιορισμένο Enum μπορεί να γραφτεί δημιουργώντας υποκλάση της κλάσης Enum με οποιοδήποτε mix-in ή τύπο δεδομένων. Για παράδειγμα:

class StrEnum(str, Enum):
    pass

Η δημιουργία υποκλάσης του Enum επιτρέπεται μόνο αν το enum δεν ορίζει κανένα μέλος. Δες τον οδηγό για το enum και το cookbook του enum για περισσότερες λεπτομέρειες και εξηγήσεις.

Επεξεργασία μέσω GitHub Ο σύνδεσμος ανοίγει σε νέο παράθυρο ή καρτέλα