Hvordan Enums i Python forbedrer kodelæsbarheden

Enums er en populær datatype i programmeringssprog som C, C++ og Java. De hjælper dig med at skrive typesikker og mere læsbar kode.

I Python blev enums ikke altid understøttet. Men siden version 3.4 understøtter Python nu enums. Denne artikel er en guide til, hvordan man opretter enums, hvordan man bruger dem, og hvordan de forbedrer kodelæsbarheden.

Hvad er Enums, og hvad gør de?

En opregning eller opregning er en datatype, der er defineret af det sæt værdier, den kan tage. Dette sæt af værdier omtales som dets sæt af medlemmer. Enums giver dig mulighed for at definere de værdier, som en variabel kunne have mere snævert. Dette hjælper dig med at skrive typesikker kode. Det forbedrer også læsbarheden.

Nogle vilkår at kende

Mens vi diskuterer enums, er der udtryk, som jeg bør definere først, da vi kommer til at bruge dem meget. Det er medlemmer og værdier.

  • Medlemmer: Disse er de navngivne konstanter, der danner det sæt af værdier, der hører til enum. For eksempel kunne Dage-oversigten indeholde følgende medlemmer: søndag, mandag, tirsdag osv.
  • Værdier: Dette er de værdier, der bruges internt til at repræsentere hvert enum-medlem tydeligt. Dette vil gøre det muligt at lave sammenligninger. For eksempel, i Days enum, kunne søndag have en værdi på 0, mandag en værdi på 1, tirsdag en værdi på 2 osv.

Nu vil vi diskutere, hvordan Enums forbedrer din kode.

Hvordan Enums forbedrer din kode

Enums forbedrer din kode og gør den mere læsbar og mindre udsat for fejl. Nedenfor er nogle af grundene til, at du bør bruge dem:

  • Enums giver dig mulighed for klart at definere, hvilke værdier et variabelt eller funktionsargument forventer. At gøre dine hensigter med et variabelt eller funktionsargument klare gør det muligt for folk at forstå din kode med lethed.
  • Enums gør også din kode selvdokumenterende. Det betyder, at du ikke behøver at tilføje kommentarer eller dokumenter for at angive, hvilke værdier en funktion forventer. I stedet specificerer din enum, hvilke værdier der forventes.
  • Dette gør det også muligt for IDE’er at fremhæve fejl, når du sender forkerte værdier, og giver autofuldførelsesunderstøttelse.
  • Som et resultat bliver din kode typesikker og mindre tilbøjelig til at producere runtime fejl.
  Hvad er forstærkningslæring?

Dernæst vil vi diskutere, hvordan man opretter Enums i Python.

Sådan opretter du enums i Python

Python har ikke indbygget understøttelse af enums. Men det giver et enums-modul i standardbiblioteket. Vi vil bruge dette modul i denne tutorial. Der er også to metoder til at oprette enums i Python: Klasser eller Function API. Jeg vil dække begge dele i dette afsnit.

Forudsætninger

For at følge denne vejledning skal du have Python 3.4 installeret. Denne version af Python leveres med enum-modulet i standardbiblioteket. Hvis du ikke har gjort det, er her en tutorial til at hjælpe dig:

For at følge vejledningen skal du kende noget Python. Dette inkluderer grundlæggende Python og mere avancerede objektorienterede programmeringskoncepter som klasser og arv.

#1. Klassemetoden

Den første metode til at oprette enums er at bruge klasser. Du importerer først enum-klassen fra enum-modulet. Dernæst opretter du din enum ved at oprette en klasse. Denne klasse vil arve fra den Enum-klasse, du importerede tidligere.

from enum import Enum

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

Du kan også tildele de værdier, du ønsker, til medlemmerne af en enum. Her er et eksempel: i stedet for at tildele 0, 1, 2 og 3 til vores vejledningsoversigt, tildeler vi deres tilsvarende overskriftsværdier på 0, 90, 180 og 270.

from enum import Enum

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

Alternativt er brugen af ​​rækkeviddefunktionen en mere kortfattet måde at generere ovenstående på. Kodestykket nedenfor viser hvordan:

from enum import Enum

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

I dette tilfælde genererer vi værdier ved hjælp af områdefunktionen. Vi angiver 0 som vores startværdi, 360 som vores slutværdi og 90 som den stigende værdi. Vi destrukturerer værdierne fra det iterable, svarende til hvordan vi destrukturerer tupler. Hvis du vil læse mere om tuple-destrukturering, er her en artikel om tupler i Python.

  10 Polaroid-kameraer til øjeblikkelig tilfredsstillelse og vintage-vibes

Enum-klasser er abstrakte klasser. Det betyder, at de ikke er beregnet til at blive instansieret. I stedet tilgås deres egenskaber, der repræsenterer enum-medlemmerne i dette tilfælde, direkte.

#2. Funktionsmetoden

Funktionsmetoden er et alternativ til underklassificeringsmetoden.

from enum import Enum

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

I ovenstående kodestykke oprettede vi en enum kaldet Direction. Det er tilgængeligt ved hjælp af fire medlemmer, som vi gav som et andet argument. Som standard får disse medlemmer værdier fra 1. Så nord er 1, øst er 2, og så videre. Dette er tilfældet og ikke et nul-baseret indeks som forventet, fordi 0 er falsk. Så for at gøre alle værdier sande, er værdierne nummereret fra 1.

Alternativt kan du tildele værdier til dine medlemmer ved at indsætte medlemmerne som en liste over tuples. Hver tupel består af to elementer: navnet på medlemmet og værdien af ​​det pågældende medlem.

from enum import Enum

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

Du vil også bemærke, at jeg brugte strenge i stedet for heltal, når jeg tildelte værdier til medlemmerne i ovenstående eksempel. Dette viser, at strenge er lige så gyldige som heltal, når der tildeles værdier.

Sådan bruges Enums

I det foregående afsnit dækkede vi oprettelse af enums og tildeling af værdier til medlemmerne. Dette afsnit vil dække brugen af ​​enums til at få adgang til og tildele medlemmer og kontrollere for ligestilling.

  En introduktion til AppleScript

Sådan får du adgang til medlemmer

Der er flere metoder til at få adgang til medlemmer af en enum. Disse omfatter punktsyntaks, parenteser og firkantet parentes. Her er et eksempel for at demonstrere ovenstående:

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

Efter at have adgang til et enum-medlem, kan du gemme det i en variabel. Bemærk, at adgang til et medlem giver dig en reference til medlemsobjektet, ikke dets værdi eller navn. Dette er vigtigt at huske i de næste par afsnit.

Adgang til navn og værdi

Som nævnt tidligere, når du tilgår et enum-medlem, opretter du en reference til medlemsobjektet. Hvis du af en eller anden grund ønsker at få adgang til navnet eller værdien af ​​enum-objektet, kan du bruge navne- og værdiegenskaberne på objektet.

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

Tjek for ligestilling

Husk, at tildeling af et enum-medlem til en variabel opretter en reference til enum-medlemsobjektet. For at kontrollere, om en variabel har et bestemt enum-medlem, bruger vi derfor operatoren is til at kontrollere, om enum-medlemmet og variablen peger på det samme objekt.

Her er et eksempel til demonstration:

today = Day.WEDNESDAY

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

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

Alternativt kan du bruge == operatoren. På superklasser af Enum-klassen er ==-operatoren en indpakning for is-operatoren. Dette gøres ved hjælp af operatøroverbelastning. Du kan læse mere om det i denne artikel om Magic Methods. Anyway, her er et eksempel, der bruger == i stedet for er.

today = Day.WEDNESDAY

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

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

Med risiko for at blive gentagne kontrollerer sammenligninger af enum for objektidentitet, ikke værdierne.

Afsluttende ord

Denne artikel dækkede, hvad enums er, og hvorfor de er nyttige. Vi dækkede også de forskellige metoder til at oprette enums ved at underklassificere Enum-klassen og bruge den funktionelle API.

Derudover dækkede vi, hvordan man bruger enums, får adgang til værdier og foretager sammenligninger. Dernæst vil du måske læse vores artikel om TypeScript-optællinger.