Cum enumerarile din Python îmbunătățesc lizibilitatea codului

În limbaje de programare precum C, C++ și Java, tipul de date cunoscut sub numele de enumerare este foarte răspândit. Acesta facilitează scrierea unui cod mai sigur și mai ușor de înțeles.

În Python, suportul pentru enumerări a fost introdus mai târziu. Începând cu versiunea 3.4, Python oferă suport nativ pentru acestea. Acest articol vă va ghida prin procesul de creare și utilizare a enumerărilor, explicând modul în care acestea pot îmbunătăți claritatea codului dumneavoastră.

Ce sunt enumerările și care este rolul lor?

O enumerare, adesea numită și „enum”, este un tip de date caracterizat prin valorile specifice pe care le poate lua. Aceste valori sunt denumite „membri”. Enumerările vă permit să restrângeți valorile posibile ale unei variabile, contribuind astfel la scrierea unui cod mai sigur și mai ușor de citit.

Termeni cheie

Înainte de a continua, este important să definim doi termeni pe care îi vom folosi frecvent: membri și valori.

  • Membri: Acestea sunt constantele cu nume care compun setul de valori asociate enumerării. De exemplu, o enumerare „Zilele săptămânii” ar putea avea membri precum „duminică”, „luni”, „marți” etc.
  • Valori: Acestea sunt valorile interne utilizate pentru a reprezenta fiecare membru al enumerării în mod unic. Acest lucru permite compararea membrilor. În exemplul „Zilele săptămânii”, duminică ar putea avea valoarea 0, luni 1, marți 2 și așa mai departe.

Acum, vom analiza modul în care enumerările îmbunătățesc calitatea codului.

Beneficiile enumerărilor pentru codul dumneavoastră

Utilizarea enumerărilor face codul mai lizibil, mai clar și mai puțin predispus la erori. Iată câteva motive pentru care ar trebui să le folosiți:

  • Enumerările vă ajută să definiți cu precizie valorile așteptate de o variabilă sau un argument de funcție. Clarificând intenția codului, acesta devine mai ușor de înțeles pentru alții.
  • Enumerările transformă codul într-un instrument de auto-documentare. Astfel, nu mai este nevoie de comentarii extinse pentru a explica valorile așteptate de o funcție. Enumerarea însăși specifică aceste valori.
  • De asemenea, mediile de dezvoltare (IDE) pot detecta erori atunci când sunt transmise valori greșite și oferă sugestii pentru completarea automată a codului.
  • În consecință, codul dumneavoastră devine mai sigur din punct de vedere al tipurilor de date, reducând riscul de erori în timpul execuției.

În continuare, vom discuta despre cum se creează enumerări în Python.

Crearea enumerărilor în Python

Python nu oferă suport direct pentru enumerări, dar biblioteca standard include un modul dedicat, „enum”, pe care îl vom utiliza. Există două metode principale pentru crearea enumerărilor în Python: prin intermediul claselor sau folosind API-ul funcțional. Vom analiza ambele abordări în această secțiune.

Cerințe preliminare

Pentru a putea urma acest tutorial, este necesară o instalare a Python 3.4 sau o versiune mai recentă, deoarece această versiune include modulul „enum” în biblioteca standard. Dacă nu aveți Python instalat, găsiți tutoriale online pentru instalare.

De asemenea, este necesară o anumită familiaritate cu programarea în Python, inclusiv elementele de bază și concepte avansate de programare orientată pe obiecte, cum ar fi clasele și moștenirea.

#1. Metoda bazată pe clase

Prima metodă pentru a defini o enumerare este prin crearea unei clase. Mai întâi, importați clasa „Enum” din modulul „enum”. Apoi, creați o clasă care moștenește clasa „Enum”.

from enum import Enum

class Direction(Enum):
    NORTH = 0
    EAST = 1
    SOUTH = 2
    WEST = 3

Puteți atribui orice valoare doriți membrilor enumerării. De exemplu, în loc de 0, 1, 2 și 3, puteți atribui valorile corespunzătoare în grade, de exemplu 0, 90, 180 și 270.

from enum import Enum

class Direction(Enum):
    NORTH = 0
    EAST = 90
    SOUTH = 180
    WEST = 270

Alternativ, puteți utiliza funcția „range” pentru a genera valorile. Iată un exemplu:

from enum import Enum

class Direction(Enum):
    NORTH, EAST, SOUTH, WEST = range(0, 360, 90)

În acest caz, valorile sunt generate de funcția „range”, care pornește de la 0, se termină înainte de 360 și crește cu 90. Valorile generate sunt atribuite membrilor enumerării, similar cu destructurarea unui tuple.

Clasele „Enum” sunt abstracte, adică nu sunt concepute pentru a fi instanțiate. În schimb, accesăm direct membrii enumerării.

#2. Metoda funcțională

Metoda funcțională este o alternativă la metoda bazată pe subclasare.

from enum import Enum

Direction = Enum("Direction", ["NORTH", "EAST", "SOUTH", "WEST"])

În acest fragment de cod, creăm o enumerare numită „Direction”, accesibilă prin patru membri. Implicit, acestor membri le sunt atribuite valori de la 1. Deci, „NORTH” are valoarea 1, „EAST” are valoarea 2 și așa mai departe. Acest lucru se datorează faptului că 0 este considerată falsă, iar pentru ca toate valorile să fie adevărate, sunt numerotate de la 1.

Alternativ, puteți atribui valori specifice membrilor prin intermediul unei liste de tuple. Fiecare tuple conține două elemente: numele membrului și valoarea acestuia.

from enum import Enum

Direction = Enum(
    name = "Direction",
    values = [
        ("NORTH", "n"),
        ("EAST", "e"),
        ("SOUTH", "s"),
        ("WEST", "w"),
    ]
)

În acest exemplu, am folosit șiruri de caractere în loc de numere întregi pentru a demonstra că orice tip de valoare este acceptat.

Cum se utilizează enumerările

Acum că am învățat cum să creăm enumerări și să atribuim valori membrilor, vom analiza cum să le folosim pentru accesarea, atribuirea și verificarea egalității membrilor.

Accesarea membrilor

Există mai multe metode pentru a accesa membrii unei enumerări: sintaxa cu punct, parantezele drepte și parantezele rotunde. Iată un exemplu:

from enum import Enum

# Crearea unei enumerări
class Day(Enum):
    SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY = range(1, 8)

# Accesarea membrilor
# 1. Sintaxa cu punct
print(Day.SUNDAY)

# 2. Paranteze drepte
print(Day["MONDAY"])

# 3. Paranteze rotunde
print(Day(3))

După ce ați accesat un membru, îl puteți stoca într-o variabilă. Rețineți că accesarea unui membru returnează o referință către obiectul membru, nu valoarea sau numele acestuia.

Accesarea numelui și valorii

Atunci când accesați un membru enum, obțineți o referință la obiectul membru. Pentru a accesa numele sau valoarea unui obiect enumerare, puteți folosi proprietățile „name” și „value” ale obiectului.

print(Day.SUNDAY.name, Day.SUNDAY.value)

Verificarea egalității

Atribuirea unui membru enum unei variabile creează o referință la obiectul membru. Pentru a verifica dacă o variabilă are un anumit membru enum, folosim operatorul „is” pentru a verifica dacă membrul enum și variabila indică același obiect.

Iată un exemplu:

today = Day.WEDNESDAY

if today is Day.MONDAY:
    print("Este luni, :(")

if today is Day.WEDNESDAY:
    print("O miercuri fericită!")

Alternativ, puteți utiliza operatorul „==”. Pentru clasele „Enum”, operatorul „==” este un înveliș pentru operatorul „is”, realizat prin supraîncărcarea operatorilor. Iată un exemplu care folosește „==” în loc de „is”:

today = Day.WEDNESDAY

if today == Day.MONDAY:
    print("Este luni, :(")

if today == Day.WEDNESDAY:
    print("O miercuri fericită!")

Rețineți că comparațiile cu enumerări verifică identitatea obiectului, nu valorile.

Concluzie

În acest articol, am discutat despre ce sunt enumerările și de ce sunt utile. Am explorat, de asemenea, diferitele metode de a crea enumerări, atât prin subclasarea clasei „Enum”, cât și prin intermediul API-ului funcțional.

În plus, am analizat cum să utilizăm enumerările, să accesăm valorile și să efectuăm comparații. Pentru a aprofunda acest subiect, vă recomandăm să citiți un articol despre enumerările în TypeScript.