Artificial Intelligence (AI)

Python Enum: How To Build Enumerations in Python

Written by smirow

Python Enum: So erstellen Sie Enums in PythonPython Enum: So erstellen Sie Enums in Python
Bild vom Autor

Wenn Sie in einer Sprache wie C++ oder Java programmiert haben, haben Sie wahrscheinlich Aufzählungen verwendet, um benannte Konstanten zu erstellen. Aufzählungen sind nützlich, wenn Sie über eine Variable verfügen, die einen festen, oft zusammenhängenden Wert wie Wochentage, Schülernoten, Bestellstatus usw. annimmt.

Python verfügt jedoch nicht über einen expliziten Enum-Datentyp. Sie können jedoch das Enum-Modul aus der Python-Standardbibliothek verwenden, um Enumerationen zu erstellen. Und dieses Tutorial zeigt Ihnen, wie es geht.

Lass uns anfangen!

Enum bedeutet „Aufzählung“ und besteht aus einer Reihe vordefinierter benannter Konstanten. Diese Konstanten sind oft verknüpft. Gängige Beispiele sind Monate eines Jahres, Wochentage, Notizen, Auftrags- und Aufgabenstatus.

Zusammenfassend lässt sich sagen: Eine Aufzählung ist im Wesentlichen eine Sammlung zusammengehöriger Konstanten, wobei jeder Konstante ein aussagekräftiger Name zugeordnet ist.

In Python können Sie Enumerationen mit dem Enum-Modul erstellen (was wir in Kürze tun werden!).

Warum Aufzählungen verwenden?

Die Verwendung von Aufzählungen trägt dazu bei, die Klarheit und Wartbarkeit des Codes zu verbessern. Hier ist wie:

  • Aufzählungen verbessern die Klarheit des Codes, indem sie magische Zahlen oder Zeichenfolgen durch aussagekräftige Beschriftungen ersetzen. Außerdem machen sie den Code selbstdokumentierender, da die Namen der Aufzählungsmitglieder ihren Zweck verdeutlichen.
  • Aufzählungen verbessern die Wartbarkeit des Codes, indem sie eine einfache Möglichkeit zum Definieren und Verwalten verwandter Konstanten bieten.
  • Indem sie Variablenzuweisungen nur auf gültige Enum-Werte beschränken, gewährleisten Enums auch die Typsicherheit.
  • Aufzählungen erleichtern das Iterieren und Vergleichen zugehöriger Konstanten.

Jetzt erstellen wir unsere erste Aufzählung in Python.

Wir werden eine erstellen TaskStatus Enumeration, die die folgenden vier Namen und Werte annimmt:

Python Enum: So erstellen Sie Enums in PythonPython Enum: So erstellen Sie Enums in Python
Bild vom Autor

Zuerst importieren wir die Enum Enum-Modulklasse zum Erstellen von Aufzählungen.

Anschließend definieren wir eine neue Klasse TaskStatus wer erbt Enum um eine Aufzählung zu erstellen. Jedes Mitglied wird mit einem eindeutigen Namen und einem optionalen Wert wie diesem definiert:

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

Alle von uns erstellten Enum-Mitglieder sind Instanzen der Enum-Klasse. Sie können dies telefonisch überprüfen isinstance() Funktioniert wie gezeigt:

print(isinstance(TaskStatus.TODO,Enum))

Drucken wir alle Mitglieder aus TaskStatus enum, indem Sie es in eine Liste umwandeln:

Sie sollten das folgende Ergebnis sehen:

Output >>>

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

Alle Mitglieder der Aufzählung haben a Name und ein Wert. Das bedeutet, dass Sie auf Aufzählungsmitglieder über deren Namen zugreifen können, z. B TaskStatus.TODO. Oder Sie greifen beispielsweise nach Wert darauf zu TaskStatus(0).

Jetzt haben wir ein einfaches erstellt TaskStatus enum, lernen wir, wie man einfache Aufgaben erledigt, wie zum Beispiel das Durchlaufen von Aufzählungsmitgliedern.

Iterieren Sie über Aufzählungen

In Python können Sie mit Enumerationen auf die gleiche Weise arbeiten wie mit jeder Iterable. Sie können zum Beispiel die verwenden len() Funktion zum Zählen der Anzahl der Enum-Mitglieder:

num_statuses = len(TaskStatus)
print(num_statuses)

Sie können auch über Aufzählungen iterieren, wie Sie es über eine Python-Iterable, beispielsweise eine Liste, tun würden. In der folgenden for-Schleife greifen wir auf den Namen und den Wert jedes Mitglieds der Aufzählung zu und geben sie aus:

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

Hier ist das Ergebnis:

Output >>> 

TODO 0
IN_PROGRESS 1
DONE 2
ABANDONED -1

Reihenfolge in Aufzählungen

Im Beispiel lauten der Status und der entsprechende Zahlenwert wie folgt:

  • TODO: 0
  • IN_PROGRESS: 1
  • FERTIG: 2
  • VERLASSEN: -1

Sie können aber auch die Standardreihenfolge verwenden, indem Sie die verwenden auto() Assistenzfunktion. Wenn Sie dies tun und die Aufzählung „n“ Mitglieder enthält, liegen die zugewiesenen Werte im Bereich von 1 bis n. Aber Sie können einen Startwert übergeben, sagen wir k, auto(k) so dass die Aufzählung bei k beginnt und bis k + n geht.

Lassen Sie es uns ändern TaskStatus Aufzählung wie gezeigt:

from enum import Enum, auto

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

Jetzt drucken wir die Mitglieder aus:

Wir sehen, dass die Werte erwartungsgemäß zwischen 1 und 4 liegen:

Output >>>

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

Jetzt bauen wir darauf auf TaskStatus Aufzählung, die wir haben. Erstellen Sie in Ihrem Arbeitsverzeichnis eine task.py-Datei mit der folgenden Version der Aufzählung:

# task.py

from enum import Enum

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

Angenommen, wir haben eine Aufgabe mit einem Namen und einem aktuellen Status. Und die gültigen Übergänge zwischen Zuständen sind:

Python Enum: So erstellen Sie Enums in PythonPython Enum: So erstellen Sie Enums in Python
Bild vom Autor

Lassen Sie uns eine erstellen Task Klasse:

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}")

Wir haben ein update_status() Methode, die prüft, ob der Übergang in den neuen Zustand angesichts des aktuellen Zustands gültig ist. Bei ungültigen Übergängen wird eine ValueError-Ausnahme ausgelöst.

Hier ist ein Beispiel dafür Task Klasse: die Aufgabe „Bericht schreiben“ mit TODO-Status:

# 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

Das Aktualisieren des Aufgabenstatus auf IN_PROGRESS sollte funktionieren, da es sich um einen gültigen Statusübergang handelt:

# 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

Und sobald die Aufgabe abgeschlossen ist, können wir ihren Status auf FERTIG aktualisieren:

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

Wenn Sie jedoch versuchen, den Status auf einen ungültigen Status zu aktualisieren, z. B. wenn Sie versuchen, DONE in TODO zu aktualisieren, wird eine ValueError-Ausnahme auftreten:

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

Hier ist die Spur des ValueError, der aufgrund eines ungültigen Statusübergangs von DONE zu TODO generiert wurde:

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

In diesem Tutorial haben wir gelernt, wie man Enumerationen in Python erstellt, indem man eine einfache TaskStatus-Enumeration codiert. Wir haben gelernt, wie man auf Aufzählungsmitglieder zugreift und diese durchläuft.

Wir haben auch erfahren, wie die Standardreihenfolge funktioniert, wenn Sie sich für die Verwendung entscheiden auto() Hilfsfunktion zum Festlegen von Enumerationselementwerten. Anschließend haben wir versucht, die TaskStatus-Enumeration in einem nützlicheren Beispiel zu verwenden.

Die Codebeispiele finden Sie auf GitHub. Wir sehen uns bald in einem weiteren Python-Tutorial. Bis dahin viel Spaß beim Codieren!

Bala Priya C ist ein indischer Entwickler und technischer Autor. Sie arbeitet gerne an der Schnittstelle von Mathematik, Programmierung, Datenwissenschaft und Inhaltserstellung. Zu seinen Interessen- und Fachgebieten gehören DevOps, Datenwissenschaft und Verarbeitung natürlicher Sprache. Sie liebt Lesen, Schreiben, Programmieren und Kaffee! Derzeit arbeitet sie daran, ihr Wissen zu erlernen und mit der Entwickler-Community zu teilen, indem sie Tutorials, Anleitungen, Meinungsbeiträge und mehr erstellt.

About the author

smirow

Leave a Comment