Λογότυπο Zephyrnet

Python Enum: Πώς να δημιουργήσετε απαριθμήσεις στην Python – KDnuggets

Ημερομηνία:

Python Enum: Πώς να δημιουργήσετε απαριθμήσεις στην Python
Εικόνα από συγγραφέα
 

Εάν έχετε προγραμματίσει σε μια γλώσσα όπως η C++ ή η Java, πιθανότατα έχετε χρησιμοποιήσει enums για να δημιουργήσετε επώνυμες σταθερές. Τα enum είναι χρήσιμα όταν έχετε μια μεταβλητή που λαμβάνει μία από έναν σταθερό αριθμό τιμών—συχνά σχετικές όπως οι ημέρες της εβδομάδας, οι βαθμοί μαθητών, η κατάσταση παραγγελίας και παρόμοια.

Η Python, ωστόσο, δεν έχει ρητό τύπο δεδομένων enum. Αλλά μπορείτε να χρησιμοποιήσετε τη μονάδα enum στην τυπική βιβλιοθήκη της Python για να δημιουργήσετε απαριθμήσεις. Και αυτό το σεμινάριο θα σας διδάξει πώς. 

Ας ξεκινήσουμε!

Το Enum σημαίνει "απαρίθμηση" και αποτελείται από ένα σύνολο προκαθορισμένων ονομασμένων σταθερών. Αυτές οι σταθερές συχνά σχετίζονται. Τα συνήθη παραδείγματα περιλαμβάνουν μήνες σε ένα έτος, ημέρες της εβδομάδας, βαθμούς, παραγγελίες και καταστάσεις εργασιών. 

Συνοψίζοντας: Ένα enum είναι ουσιαστικά μια συλλογή σχετικών σταθερών, όπου κάθε σταθερά έχει ένα σημαντικό όνομα που σχετίζεται με αυτήν.

Στην Python, μπορείτε να δημιουργήσετε enum χρησιμοποιώντας το μονάδα enum (το οποίο θα κάνουμε σύντομα!).

Γιατί να χρησιμοποιήσετε το Enums

Η χρήση enums βοηθά στη βελτίωση της σαφήνειας και της συντηρησιμότητας του κώδικα. Να πώς: 

  • Τα enum βελτιώνουν τη σαφήνεια του κώδικα αντικαθιστώντας τους μαγικούς αριθμούς ή τις συμβολοσειρές με σημαντικές ετικέτες. Κάνουν επίσης τον κώδικα πιο αυτοτεκμηριωμένο, καθώς τα ονόματα των μελών enum εκφράζουν τον σκοπό τους. 
  • Τα Enum βελτιώνουν τη δυνατότητα συντήρησης του κώδικα παρέχοντας έναν απλό τρόπο ορισμού και διαχείρισης σχετικών σταθερών. 
  • Περιορίζοντας τις εκχωρήσεις μεταβλητών μόνο σε έγκυρες τιμές enum, τα enum εξασφαλίζουν επίσης ασφάλεια τύπου. 
  • Οι αριθμοί διευκολύνουν την εύκολη επανάληψη και σύγκριση των σχετικών σταθερών.

Τώρα ας δημιουργήσουμε την πρώτη μας απαρίθμηση στην Python.

Θα δημιουργήσουμε ένα TaskStatus enum που παίρνει τα ακόλουθα τέσσερα ονόματα και τιμές:

 

Python Enum: Πώς να δημιουργήσετε απαριθμήσεις στην Python
Εικόνα από συγγραφέα
 

Αρχικά, εισάγουμε το Enum κλάση από τη μονάδα enum για τη δημιουργία enum. 

Στη συνέχεια ορίζουμε μια νέα κλάση TaskStatus που κληρονομεί από Enum για να δημιουργήσετε μια απαρίθμηση. Κάθε μέλος ορίζεται με ένα μοναδικό όνομα και μια προαιρετική τιμή όπως:

from enum import Enum
	 
class TaskStatus(Enum):
    TODO = 0
    IN_PROGRESS = 1
    DONE = 2
    ABANDONED = -1

 

Όλα τα μέλη enum που δημιουργούμε είναι παρουσίες της κλάσης Enum. Μπορείτε να το επαληθεύσετε καλώντας το isinstance() λειτουργεί όπως φαίνεται:

print(isinstance(TaskStatus.TODO,Enum))

 

Output >>> True

 

Ας εκτυπώσουμε όλα τα μέλη στο TaskStatus enum ρίχνοντάς το σε μια λίστα:

print(list(TaskStatus))

 

Θα πρέπει να δείτε την ακόλουθη έξοδο:

Output >>>

[<TaskStatus.TODO: 0>, <TaskStatus.IN_PROGRESS: 1>, <TaskStatus.DONE: 2>, <TaskStatus.ABANDONED: -1>]

 

Όλα τα μέλη του enum έχουν α όνομα και σε έναν αξία. Αυτό σημαίνει ότι μπορείτε να αποκτήσετε πρόσβαση στα μέλη του enum χρησιμοποιώντας τα ονόματά τους, όπως TaskStatus.TODO. Ή έχετε πρόσβαση σε αυτά με βάση την τιμή, όπως TaskStatus(0).

Τώρα που δημιουργήσαμε ένα απλό TaskStatus enum, ας μάθουμε πώς να εκτελούμε απλές εργασίες, όπως η επανάληψη πάνω από τα μέλη enum.

Επανάληψη Πάνω από Enums

Στην Python, μπορείτε να δουλέψετε με enums σχεδόν με τον ίδιο τρόπο που εργάζεστε με οποιοδήποτε iterable. Για παράδειγμα, μπορείτε να χρησιμοποιήσετε το len() συνάρτηση μέτρησης του αριθμού των μελών enum:

num_statuses = len(TaskStatus)
print(num_statuses)

 

Output >>> 4

 

Μπορείτε επίσης να κάνετε επανάληψη πάνω από τα enums ακριβώς όπως θα κάνατε σε έναν επαναληπτικό Python όπως η λίστα. Στον παρακάτω βρόχο for, έχουμε πρόσβαση τόσο στο όνομα όσο και στην τιμή κάθε μέλους enum και τα εκτυπώνουμε:

for status in TaskStatus:
    print(status.name, status.value)

 

Εδώ είναι η έξοδος:

Output >>> 

TODO 0
IN_PROGRESS 1
DONE 2
ABANDONED -1

Παραγγελία σε Enums

Στο παράδειγμα, η κατάσταση και η αντίστοιχη αριθμητική τιμή έχουν ως εξής:

  • TODO: 0
  • ΣΕ ΠΡΟΟΔΟΣ: 1
  • ΤΕΛΟΣ: 2
  • ΕΓΚΑΤΑΛΕΙΨΗ: -1

Αλλά μπορείτε επίσης να χρησιμοποιήσετε την προεπιλεγμένη παραγγελία χρησιμοποιώντας το auto() βοηθητική λειτουργία. Όταν το κάνετε αυτό, εάν έχετε «n» μέλη στο enum, οι τιμές που εκχωρούνται είναι 1 έως n. Αλλά μπορείτε να περάσετε σε μια τιμή έναρξης, ας πούμε k, auto(k) για να ξεκινήσει η απαρίθμηση από το k και να ανέβει στο k + n.

Ας τροποποιήσουμε το TaskStatus enum όπως φαίνεται:

from enum import Enum, auto

class TaskStatus(Enum):
    TODO = auto()
    IN_PROGRESS = auto()
    DONE = auto()
    ABANDONED = auto()

 

Τώρα ας εκτυπώσουμε τα μέλη:

print(list(TaskStatus))

 

Βλέπουμε ότι οι τιμές είναι 1 έως 4 όπως αναμενόταν:

Output >>>

[<TaskStatus.TODO: 1>, <TaskStatus.IN_PROGRESS: 2>, <TaskStatus.DONE: 3>, <TaskStatus.ABANDONED: 4>]

Τώρα ας χτίσουμε πάνω στο TaskStatus enum που έχουμε. Δημιουργήστε ένα αρχείο task.py στον κατάλογο εργασίας σας με την ακόλουθη έκδοση του enum:

# task.py

from enum import Enum

class TaskState(Enum):
    TODO = 0
    IN_PROGRESS = 1
    DONE = 2
    ABANDONED = -1

 

Ας πούμε ότι έχουμε μια εργασία με όνομα και τρέχουσα κατάσταση. Και οι έγκυρες μεταβάσεις μεταξύ των καταστάσεων είναι όπως φαίνεται:

 

Python Enum: Πώς να δημιουργήσετε απαριθμήσεις στην Python
Εικόνα από συγγραφέα
 

Ας δημιουργήσουμε ένα Task τάξη:

class Task:
    def __init__(self, name, state):
        self.name = name
        self.state = state
    
    def update_state(self, new_state):
        # Define valid state transitions based on the current state
        valid_transitions = {
        	TaskState.TODO: [TaskState.IN_PROGRESS, TaskState.ABANDONED],
        	TaskState.IN_PROGRESS: [TaskState.DONE, TaskState.ABANDONED],
        	TaskState.DONE: [],
        	TaskState.ABANDONED: []
    	}
   	 
        # Check if the new state is a valid transition from the current state
        if new_state in valid_transitions[self.state]:
            self.state = new_state
        else:
            raise ValueError(f"Invalid state transition from {self.state.name} to {new_state.name}")

 

Έχουμε μια update_status() μέθοδος που ελέγχει εάν η μετάβαση στη νέα κατάσταση είναι έγκυρη δεδομένης της τρέχουσας κατάστασης. Για μη έγκυρες μεταβάσεις, δημιουργείται μια εξαίρεση ValueError.

Εδώ είναι ένα παράδειγμα του Task class: η εργασία "Εγγραφή αναφοράς" με κατάσταση TODO:

# Create a new task with the initial state "To Do"
task = Task("Write Report", TaskState.TODO)

# Print the task details
print(f"Task Name: {task.name}")
print(f"Current State: {task.state.name}")

 

Output >>>
Task Name: Write Report
Current State: TODO

 

Η ενημέρωση της κατάστασης της εργασίας σε IN_PROGRESS θα πρέπει να λειτουργεί καθώς πρόκειται για μια έγκυρη μετάβαση κατάστασης:

# Update the task state to "In Progress"
task.update_state(TaskState.IN_PROGRESS)
print(f"Updated State: {task.state.name}")

 

Output >>> Updated State: IN_PROGRESS

 

Και μόλις ολοκληρωθεί η εργασία, μπορούμε να ενημερώσουμε την κατάστασή της σε ΟΛΟΚΛΗΡΩΣΗ:

# Update the task state to "DONE"
task.update_state(TaskState.DONE)
print(f"Updated State: {task.state.name}")

 

Output >>> Updated State: DONE

 

Αλλά αν προσπαθήσετε να ενημερώσετε την κατάσταση σε μη έγκυρη κατάσταση, όπως η προσπάθεια ενημέρωσης ΤΕΛΟΣ σε TODO, θα συναντήσετε εξαίρεση ValueError:

# Attempt to update the task state to an invalid state
task.update_state(TaskState.TODO)

 

Ακολουθεί η ανίχνευση του ValueError που προέκυψε λόγω μη έγκυρης μετάβασης κατάστασης από DONE σε TODO:

Traceback (most recent call last):
  File "/home/balapriya/enums/task.py", line 46, in 
	task.update_state(TaskState.TODO)
  File "/home/balapriya/enums/task.py", line 30, in update_state
	raise ValueError(f"Invalid state transition from {self.state.name} to {new_state.name}")
ValueError: Invalid state transition from DONE to TODO

Σε αυτό το σεμινάριο, μάθαμε πώς να δημιουργούμε απαριθμήσεις στην Python κωδικοποιώντας ένα απλό TaskStatus enum. Μάθαμε πώς να έχουμε πρόσβαση στα μέλη του enum και να τα επαναλαμβάνουμε. 

Επίσης, μάθαμε πώς λειτουργεί η προεπιλεγμένη παραγγελία εάν επιλέξετε να χρησιμοποιήσετε το auto() βοηθητική συνάρτηση για να ορίσετε τις τιμές για τα μέλη enum. Στη συνέχεια προσπαθήσαμε να χρησιμοποιήσουμε το TaskStatus enum σε ένα πιο χρήσιμο παράδειγμα. 

Μπορείτε να βρείτε το παραδείγματα κώδικα στο GitHub. Θα σας δω όλους σύντομα σε άλλο σεμινάριο Python. Μέχρι τότε, καλή κωδικοποίηση!
 
 

Bala Priya C είναι προγραμματιστής και τεχνικός συγγραφέας από την Ινδία. Της αρέσει να εργάζεται στη διασταύρωση των μαθηματικών, του προγραμματισμού, της επιστήμης δεδομένων και της δημιουργίας περιεχομένου. Οι τομείς ενδιαφέροντος και εξειδίκευσής της περιλαμβάνουν τα DevOps, την επιστήμη δεδομένων και την επεξεργασία φυσικής γλώσσας. Της αρέσει να διαβάζει, να γράφει, να κωδικοποιεί και τον καφέ! Επί του παρόντος, εργάζεται για να μάθει και να μοιράζεται τις γνώσεις της με την κοινότητα προγραμματιστών, γράφοντας σεμινάρια, οδηγούς με οδηγίες, απόψεις και πολλά άλλα.

spot_img

Τελευταία Νοημοσύνη

spot_img