Enums i Python: Skriv renere & mer lesbar kode!

Innføring i Enums i Python

Enums, eller enumerasjoner, er en populær datatype i mange programmeringsspråk, som C, C++ og Java. De er nyttige for å skrive kode som er typesikker og lett å lese.

Python har ikke alltid hatt innebygd støtte for enums. Men fra og med versjon 3.4, har Python inkludert en enum-modul. Denne artikkelen er en guide til hvordan du lager og bruker enumerasjoner, og hvordan de kan forbedre lesbarheten i koden din.

Hva er Enums og hva gjør de?

En enum, eller enumerasjon, er en datatype som defineres av et sett med verdier. Dette settet med verdier kalles for medlemmene. Enums gir deg muligheten til å definere begrensningene for verdiene en variabel kan ha. Dette bidrar til å skrive typesikker kode og forbedrer lesbarheten.

Viktige Termer å Kjenne

Før vi går videre, er det noen viktige begreper vi bør definere: medlemmer og verdier.

  • Medlemmer: Dette er de navngitte konstantene som utgjør det mulige settet av verdier i en enum. For eksempel, en enum for dager i uken kan ha medlemmene: søndag, mandag, tirsdag, osv.
  • Verdier: Dette er de interne representasjonene av hvert enum-medlem, slik at de kan sammenlignes. For eksempel kan søndag ha verdien 0, mandag verdien 1, tirsdag verdien 2, og så videre.

La oss se nærmere på hvordan enums forbedrer kodekvaliteten.

Hvordan Enums Forbedrer Koden Din

Enums gjør koden mer lesbar og mindre utsatt for feil. Her er noen grunner til å bruke dem:

  • Enums tydeliggjør hvilke verdier en variabel eller et funksjonsargument forventer. Dette gjør koden lettere å forstå for andre.
  • Enums bidrar til at koden blir mer selvdokumenterende, noe som reduserer behovet for kommentarer. Selve enum-definisjonen spesifiserer de forventede verdiene.
  • IDE-er kan oppdage feil ved bruk av ugyldige verdier og tilby autofullføring.
  • Dette fører til typesikker kode og færre runtime-feil.

La oss nå se hvordan vi oppretter Enums i Python.

Hvordan Lage Enums i Python

Python har ikke innebygd støtte for enums, men tilbyr en enum-modul i standardbiblioteket. Vi vil bruke denne modulen i denne opplæringen. Det finnes to metoder for å lage enums i Python: ved bruk av klasser eller ved bruk av en funksjons-API. Vi skal dekke begge metodene.

Forutsetninger

For å følge denne veiledningen, må du ha Python 3.4 eller nyere installert. Denne versjonen inkluderer enum-modulen i standardbiblioteket. Hvis du mangler dette, finnes det en rekke guider for installasjon.

Det er også en fordel å ha litt kjennskap til Python, inkludert grunnleggende og mer avanserte objektorienterte konsepter som klasser og arv.

#1. Klassemetoden

Den første metoden for å lage enums er ved å bruke klasser. Først må du importere Enum-klassen fra enum-modulen. Deretter oppretter du din enum ved å lage en klasse som arver fra den importerte Enum-klassen.

from enum import Enum

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

Du kan også gi medlemmene i en enum hvilke verdier du ønsker. Her er et eksempel hvor vi bruker kompassretningers vinkler i stedet for 0, 1, 2 og 3:

from enum import Enum

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

Alternativt kan range-funksjonen brukes for å generere tallrekker. Her er et eksempel:

from enum import Enum

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

I dette tilfellet genererer vi verdier ved hjelp av range-funksjonen. Startverdien er 0, sluttverdien er 360, og økningen er 90. Verdiene fra den iterable er så destrukturert på samme måte som tupler. Hvis du vil lære mer om destrukturering av tupler, finnes det mange artikler om dette.

Enum-klasser er abstrakte klasser, noe som betyr at de ikke skal instansieres. I stedet aksesseres egenskapene deres, som i dette tilfellet representerer enum-medlemmene, direkte.

#2. Funksjonsmetoden

Funksjonsmetoden er et alternativ til å arve en klasse.

from enum import Enum

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

I koden over har vi opprettet en enum kalt Direction med fire medlemmer. Som standard vil disse medlemmene få verdiene 1, 2, 3 og 4. Dette er fordi 0 er en «falsy» verdi, og alle verdier skal representere «truthy» verdier.

Du kan også eksplisitt definere verdier ved å gi medlemmene som en liste med tupler, der hver tuppel inneholder medlemmets navn og verdi:

from enum import Enum

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

I dette eksemplet bruker vi strenger i stedet for tall for å definere verdier, noe som er like gyldig.

Hvordan Bruke Enums

Vi har sett hvordan vi kan opprette enums og gi medlemmene verdier. La oss se hvordan vi kan bruke dem til å aksessere og tildele medlemmer, samt sjekke likhet.

Hvordan Aksessere Medlemmer

Det finnes flere måter å aksessere medlemmene i en enum, inkludert ved hjelp av punktum, hakeparenteser og vanlige parenteser. Her er et eksempel:

from enum import Enum

# Lager en enum
class Day(Enum):
    SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY = range(1, 8)

# Aksesserer enum-medlemmer
# 1. Bruker punktum
print(Day.SUNDAY)

# 2. Bruker hakeparenteser
print(Day["MONDAY"])

# 3. Bruker parenteser
print(Day(3))

Når du har aksessert et medlem, kan du lagre det i en variabel. Det er viktig å merke seg at dette gir deg en referanse til medlemsobjektet, ikke verdien eller navnet. Dette er viktig i de neste avsnittene.

Aksessere Navn og Verdi

Som nevnt tidligere, aksesserer du et enum-medlem, får du en referanse til objektet. Hvis du vil aksessere navnet eller verdien til medlemmet, kan du bruke egenskapene name og value.

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

Sjekke Likhet

Når du tildeler et enum-medlem til en variabel, opprettes en referanse til medlemsobjektet. For å sjekke om en variabel er det samme enum-medlemmet, kan vi bruke is-operatoren. Dette sjekker om de peker til samme objekt.

Her er et eksempel:

today = Day.WEDNESDAY

if today is Day.MONDAY:
    print("Det er mandag, :(")

if today is Day.WEDNESDAY:
    print("God onsdag")

Alternativt kan du bruke ==-operatoren. For superklasser av Enum, er ==-operatoren en «wrapper» for is-operatoren, og dette oppnås ved bruk av operatoroverbelastning. Uansett, her er et eksempel med == i stedet for is.

today = Day.WEDNESDAY

if today == Day.MONDAY:
    print("Det er mandag, :(")

if today == Day.WEDNESDAY:
    print("God onsdag")

Husk at sammenligninger av enums sjekker for objektidentitet, ikke bare verdier.

Avsluttende Ord

Denne artikkelen har forklart hva enums er og hvorfor de er nyttige. Vi har sett på ulike metoder for å lage enums: ved å arve fra Enum-klassen og ved å bruke funksjons-API-et.

Vi har også sett på hvordan enums brukes, hvordan man aksesserer verdier og hvordan man sjekker likhet. Hvis du vil lære mer om relaterte konsepter, kan du vurdere å lese artikler om TypeScript enums.