Zephyrnet-logo

Python Enum: opsommingen bouwen in Python – KDnuggets

Datum:

Python Enum: opsommingen bouwen in Python
Afbeelding door auteur
 

Als je in een taal als C++ of Java hebt geprogrammeerd, heb je waarschijnlijk enums gebruikt om benoemde constanten te maken. Opsommingen zijn handig als u een variabele heeft die een vast aantal waarden aanneemt, vaak gerelateerd aan de dagen van de week, de cijfers van leerlingen, de bestelstatus en dergelijke.

Python heeft echter geen expliciet enum-gegevenstype. Maar u kunt de enum-module in de standaardbibliotheek van Python gebruiken om opsommingen te maken. En deze tutorial leert je hoe. 

Laten we beginnen!

Enum staat voor “opsomming” en bestaat uit een reeks vooraf gedefinieerde benoemde constanten. Deze constanten zijn vaak gerelateerd. Veel voorkomende voorbeelden zijn maanden in een jaar, dagen van de week, cijfers, order- en taakstatussen. 

Samenvattend: een enum is in wezen een verzameling gerelateerde constanten, waarbij aan elke constante een betekenisvolle naam is gekoppeld.

In Python kun je enums maken met behulp van de enum-module (wat we binnenkort zullen doen!).

Waarom Enums gebruiken

Het gebruik van enums helpt de duidelijkheid en onderhoudbaarheid van de code te verbeteren. Hier is hoe: 

  • Enums verbeteren de duidelijkheid van de code door magische getallen of tekenreeksen te vervangen door betekenisvolle labels. Ze maken de code ook meer zelfdocumenterend omdat de namen van enum-leden hun doel overbrengen. 
  • Enums verbeteren de onderhoudbaarheid van de code door een eenvoudige manier te bieden om gerelateerde constanten te definiëren en te beheren. 
  • Door de toewijzing van variabelen te beperken tot alleen geldige enumwaarden, zorgen enums ook voor typeveiligheid. 
  • Enums vergemakkelijken eenvoudige iteratie en vergelijking van gerelateerde constanten.

Laten we nu onze eerste opsomming in Python maken.

We maken een TaskStatus enum waaraan de volgende vier namen en waarden moeten voldoen:

 

Python Enum: opsommingen bouwen in Python
Afbeelding door auteur
 

Eerst importeren we de Enum class uit de enum-module om enums te maken. 

Vervolgens definiëren we een nieuwe klasse TaskStatus dat erft van Enum om een ​​opsomming te maken. Elk lid wordt gedefinieerd met een unieke naam en een optionele waarde, zoals:

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

 

Alle enum-leden die we maken zijn exemplaren van de Enum-klasse. U kunt dit verifiëren door te bellen met de isinstance() functie zoals getoond:

print(isinstance(TaskStatus.TODO,Enum))

 

Output >>> True

 

Laten we alle leden in de TaskStatus enum door het in een lijst te gieten:

print(list(TaskStatus))

 

Je zou de volgende output moeten zien:

Output >>>

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

 

Alle enum-leden hebben een naam en waarde. Dit betekent dat je toegang hebt tot enum-leden met behulp van hun naam, zoals TaskStatus.TODO. Of je hebt toegang tot ze op basis van waarde, bijvoorbeeld TaskStatus(0).

Nu we een eenvoudig TaskStatus enum, laten we leren hoe we eenvoudige taken kunnen uitvoeren, zoals het herhalen van de enum-leden.

Itereren over enums

In Python kun je vrijwel op dezelfde manier met enums werken als met elke iterabele. U kunt bijvoorbeeld gebruik maken van de len() functie om het aantal enum-leden te tellen:

num_statuses = len(TaskStatus)
print(num_statuses)

 

Output >>> 4

 

Je kunt ook opsommingen herhalen, net zoals je dat zou doen met een iterabele Python-lijst, zoals een lijst. In de volgende for-lus hebben we toegang tot zowel de naam als de waarde van elk enum-lid en drukken we deze af:

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

 

Hier is de output:

Output >>> 

TODO 0
IN_PROGRESS 1
DONE 2
ABANDONED -1

Bestellen in Enums

In het voorbeeld zijn de status en de bijbehorende numerieke waarde als volgt:

  • TODO: 0
  • IN_PROGRESS: 1
  • GEDAAN: 2
  • VERLATEN: -1

Maar u kunt ook de standaardvolgorde gebruiken door gebruik te maken van de auto() helper functie. Wanneer u dit doet en er 'n' leden in de enum zijn, zijn de toegewezen waarden 1 tot en met n. Maar je kunt een startwaarde doorgeven, bijvoorbeeld k, auto(k) zodat de opsomming begint bij k en omhoog gaat naar k + n.

Laten we de TaskStatus opsomming zoals weergegeven:

from enum import Enum, auto

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

 

Laten we nu de leden afdrukken:

print(list(TaskStatus))

 

We zien dat de waarden zoals verwacht 1 tot 4 zijn:

Output >>>

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

Laten we nu voortbouwen op de TaskStatus enum die we hebben. Maak een task.py-bestand in uw werkmap met de volgende versie van de enum:

# task.py

from enum import Enum

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

 

Stel dat we een taak hebben met een naam en een huidige status. En de geldige overgangen tussen toestanden zijn zoals weergegeven:

 

Python Enum: opsommingen bouwen in Python
Afbeelding door auteur
 

Laten we een maken 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}")

 

We hebben een update_status() methode die controleert of de overgang naar de nieuwe staat geldig is gezien de huidige status. Voor ongeldige overgangen wordt een ValueError-uitzondering gegenereerd.

Hier is een voorbeeld van de Task klasse: de taak “Rapport schrijven” met status 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

 

Het bijwerken van de status van de taak naar IN_PROGRESS zou moeten werken omdat het een geldige statusovergang is:

# 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

 

En zodra de taak is voltooid, kunnen we de status ervan bijwerken naar DONE:

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

 

Output >>> Updated State: DONE

 

Maar als u probeert de status bij te werken naar een ongeldige status, bijvoorbeeld als u DONE probeert bij te werken naar TODO, komt u een ValueError-uitzondering tegen:

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

 

Hier is de traceback van de ValueError die is gegenereerd vanwege een ongeldige statusovergang van DONE naar 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

In deze zelfstudie hebben we geleerd hoe we opsommingen in Python kunnen bouwen door een eenvoudige TaskStatus-opsomming te coderen. We hebben geleerd hoe we toegang kunnen krijgen tot enum-leden en hoe we deze kunnen herhalen. 

We hebben ook geleerd hoe de standaardbestelling werkt als u ervoor kiest om de auto() helperfunctie om de waarden voor enum-leden in te stellen. Vervolgens hebben we geprobeerd de TaskStatus-opsomming te gebruiken in een nuttiger voorbeeld. 

U kunt het vinden codevoorbeelden op GitHub. Ik zie jullie allemaal binnenkort in een andere Python-tutorial. Tot dan, veel codeerplezier!
 
 

Bala Priya C is een ontwikkelaar en technisch schrijver uit India. Ze werkt graag op het snijvlak van wiskunde, programmeren, datawetenschap en contentcreatie. Haar interessegebieden en expertise omvatten DevOps, data science en natuurlijke taalverwerking. Ze houdt van lezen, schrijven, coderen en koffie drinken! Momenteel werkt ze aan het leren en delen van haar kennis met de gemeenschap van ontwikkelaars door het schrijven van zelfstudies, handleidingen, opiniestukken en meer.

spot_img

Laatste intelligentie

spot_img