Hvordan Enums i Python forbedrer kodelesbarheten

Enums er en populær datatype i programmeringsspråk som C, C++ og Java. De hjelper deg med å skrive typesikker og mer lesbar kode.

I Python ble ikke alltid oppslag støttet. Siden versjon 3.4 støtter imidlertid Python nå enums. Denne artikkelen er en veiledning for hvordan du lager oppsummeringer, hvordan du bruker dem og hvordan de forbedrer kodelesbarheten.

Hva er Enums, og hva gjør de?

En enum eller en enumerasjon er en datatype definert av settet med verdier den kan ta. Dette settet med verdier blir referert til som settet med medlemmer. Enums lar deg definere verdiene som en variabel kan ha mer snevert. Dette hjelper deg med å skrive typesikker kode. Det forbedrer også lesbarheten.

Noen vilkår å vite

Når vi diskuterer enums, er det begreper jeg bør definere først, siden vi kommer til å bruke dem mye. Dette er medlemmer og verdier.

  • Medlemmer: Dette er de navngitte konstantene som danner settet med verdier som tilhører enum. Dageneum kan for eksempel inneholde følgende medlemmer: søndag, mandag, tirsdag osv.
  • Verdier: Dette er verdiene som brukes internt for å representere hvert enum-medlem distinkt. Dette vil gjøre det mulig å gjøre sammenligninger. For eksempel, i Days enum, kan søndag ha en verdi på 0, mandag en verdi på 1, tirsdag en verdi på 2, osv.

Nå skal vi diskutere hvordan Enums forbedrer koden din.

Hvordan Enums forbedrer koden din

Enums forbedrer koden din og gjør den mer lesbar og mindre utsatt for feil. Nedenfor er noen av grunnene til at du bør bruke dem:

  • Enums lar deg definere hvilke verdier et variabel- eller funksjonsargument forventer tydelig. Å gjøre intensjonene dine med et variabelt eller funksjonsargument klare, gjør det mulig for folk å forstå koden din med letthet.
  • Enums gjør også koden din selvdokumenterende. Dette betyr at du ikke trenger å legge til kommentarer eller dokumenter for å spesifisere hvilke verdier en funksjon forventer. Snarere spesifiserer enumen din hvilke verdier som forventes.
  • Dette gjør det også mulig for IDE-er å markere feil når du sender feil verdier og gi støtte for autofullføring.
  • Som et resultat blir koden din typesikker og mindre sannsynlighet for å produsere kjøretidsfeil.
  Hvordan koble en hvilken som helst smart enhet til HomeKit (med en Raspberry Pi)

Deretter vil vi diskutere hvordan du lager Enums i Python.

Hvordan lage enums i Python

Python har ikke innebygd støtte for enums. Men det gir en enums-modul i standardbiblioteket. Vi vil bruke den modulen i denne opplæringen. Det er også to metoder for å lage enums i Python: Classes eller Function API. Jeg vil dekke begge deler i denne delen.

Forutsetninger

For å følge denne opplæringen trenger du Python 3.4 installert. Denne versjonen av Python kommer med enum-modulen i standardbiblioteket. Hvis du ikke har gjort det, her er en veiledning for å hjelpe deg:

For å følge opplæringen må du kjenne litt Python. Dette inkluderer grunnleggende Python og mer avanserte objektorienterte programmeringskonsepter som klasser og arv.

#1. Klassemetoden

Den første metoden for å lage enums er å bruke klasser. Du importerer først enum-klassen fra enum-modulen. Deretter oppretter du enumen din ved å opprette en klasse. Denne klassen vil arve fra Enum-klassen du importerte tidligere.

from enum import Enum

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

Du kan også tilordne eventuelle verdier du vil til medlemmene i en opptelling. Her er et eksempel: i stedet for å tilordne 0, 1, 2 og 3 til veibeskrivelsen vår, tildeler vi deres tilsvarende overskriftsverdier på 0, 90, 180 og 270.

from enum import Enum

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

Alternativt er bruk av rekkeviddefunksjonen en mer kortfattet måte å generere ovenstående på. Kodebiten nedenfor viser hvordan:

from enum import Enum

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

I dette tilfellet genererer vi verdier ved å bruke rekkeviddefunksjonen. Vi angir 0 som startverdi, 360 som sluttverdi og 90 som økende verdi. Vi destrukturerer verdiene fra det iterable, på samme måte som vi destrukturerer tupler. Hvis du vil lese mer om destrukturering av tuppel, er her en artikkel om tuppel i Python.

  Hvordan dele datamaskinlyd i zoom

Enum-klasser er abstrakte klasser. Dette betyr at de ikke er ment å bli instansiert. I stedet får egenskapene deres, som representerer enum-medlemmene i dette tilfellet, direkte tilgang.

#2. Funksjonsmetoden

Funksjonsmetoden er et alternativ til underklassingsmetoden.

from enum import Enum

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

I kodebiten ovenfor opprettet vi en enum kalt Direction. Den er tilgjengelig ved hjelp av fire medlemmer, som vi ga som et andre argument. Som standard får disse medlemmene verdier fra 1. Så nord er 1, øst er 2, og så videre. Dette er tilfellet og ikke en null-basert indeks som forventet fordi 0 er falsk. Så for å gjøre alle verdier sanne, er verdiene nummerert fra 1.

Alternativt kan du tilordne verdier til medlemmene dine ved å sende inn medlemmene som en liste over tupler. Hver tuppel består av to elementer: navnet på medlemmet og verdien til det medlemmet.

from enum import Enum

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

Du vil også legge merke til at jeg brukte strenger i stedet for heltall når jeg tilordnet verdier til medlemmene i eksemplet ovenfor. Dette viser at strenger er like gyldige som heltall når du tildeler verdier.

Hvordan bruke Enums

I forrige seksjon dekket vi å lage oppsummeringer og tildele verdier til medlemmene. Denne delen vil dekke bruk av enums for å få tilgang til og tildele medlemmer og sjekke for likhet.

  11 podcastmikrofoner for å omdefinere lydstandarder

Hvordan få tilgang til medlemmer

Det er flere metoder for å få tilgang til medlemmer av en enum. Disse inkluderer punktsyntaks, parenteser og hakeparentessyntaks. Her er et eksempel for å demonstrere det ovenfor:

from enum import Enum

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

# Accessing enum members
# 1. Using dot syntax
print(Day.SUNDAY)

# 2. Using square brackets
print(Day["MONDAY"])

# 3. Using the parentheses
print(Day(3))

Etter å ha tilgang til et enum-medlem, kan du lagre det i en variabel. Merk at tilgang til et medlem gir deg en referanse til medlemsobjektet, ikke dets verdi eller navn. Dette er viktig å huske i de neste avsnittene.

Få tilgang til navn og verdi

Som nevnt tidligere, når du får tilgang til et enum-medlem, oppretter du en referanse til medlemsobjektet. Hvis du av en eller annen grunn ønsker å få tilgang til navnet eller verdien til enum-objektet, kan du bruke navn- og verdiegenskapene på objektet.

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

Sjekker for likestilling

Husk at å tilordne et enum-medlem til en variabel oppretter en referanse til enum-medlemsobjektet. Derfor, for å sjekke om en variabel har et bestemt enum-medlem, bruker vi is-operatoren for å sjekke om enum-medlemmet og variabelen peker til samme objekt.

Her er et eksempel for å demonstrere:

today = Day.WEDNESDAY

if today is Day.MONDAY:
    print("It's a Monday, :(")

if today is Day.WEDNESDAY:
    print("Happy Wednesday")

Alternativt kan du bruke ==-operatoren. På superklasser av Enum-klassen er ==-operatoren en innpakning for is-operatoren. Dette gjøres ved bruk av operatøroverbelastning. Du kan lese mer om det i denne artikkelen om magiske metoder. Uansett, her er et eksempel som bruker == i stedet for er.

today = Day.WEDNESDAY

if today == Day.MONDAY:
    print("It's a Monday, :(")

if today == Day.WEDNESDAY:
    print("Happy Wednesday")

Med fare for å bli repeterende, sjekker enum-sammenligninger for objektidentitet, ikke verdiene.

Siste ord

Denne artikkelen dekket hva enums er og hvorfor de er nyttige. Vi dekket også de forskjellige metodene for å lage enums ved å underklasse Enum-klassen og bruke det funksjonelle API-et.

I tillegg dekket vi hvordan du bruker enums, får tilgang til verdier og gjør sammenligninger. Deretter vil du kanskje lese artikkelen vår om TypeScript-oppslag.