Jak výčty v Pythonu zlepšují čitelnost kódu

Výčty jsou oblíbeným datovým typem v programovacích jazycích, jako je C, C++ a Java. Pomáhají vám psát typově bezpečný a čitelnější kód.

V Pythonu nebyly výčty vždy podporovány. Od verze 3.4 však Python nyní podporuje výčty. Tento článek je průvodcem, jak vytvářet výčty, jak je používat a jak zlepšují čitelnost kódu.

Co jsou výčty a co dělají?

Výčet nebo výčet je datový typ definovaný sadou hodnot, které může nabývat. Tato sada hodnot se označuje jako její sada členů. Výčty umožňují úžeji definovat hodnoty, které by proměnná mohla mít. To vám pomůže napsat typově bezpečný kód. Zlepšuje také čitelnost.

Některé pojmy, které byste měli znát

Když diskutujeme o výčtech, existují pojmy, které bych měl nejprve definovat, protože je budeme často používat. To jsou členové a hodnoty.

  • Členové: Jedná se o pojmenované konstanty, které tvoří sadu hodnot, které patří do výčtu. Například výčet dnů může obsahovat následující členy: neděle, pondělí, úterý atd.
  • Hodnoty: Toto jsou hodnoty, které se interně používají k samostatné reprezentaci každého člena výčtu. To umožní provádět srovnání. Například ve výčtu dnů může mít neděle hodnotu 0, pondělí hodnotu 1, úterý hodnotu 2 atd.

Nyní probereme, jak Enums vylepší váš kód.

Jak Enumové vylepšují váš kód

Výčty zlepšují váš kód a činí jej čitelnějším a méně náchylným k chybám. Níže jsou uvedeny některé z důvodů, proč byste je měli používat:

  • Výčty vám umožňují jasně definovat, jaké hodnoty argument proměnné nebo funkce očekává. Vyjasnění vašich záměrů pomocí argumentu proměnné nebo funkce umožní lidem snadno porozumět vašemu kódu.
  • Výčty také činí váš kód samodokumentačním. To znamená, že nemusíte přidávat komentáře nebo dokumenty, abyste určili, jaké hodnoty funkce očekává. Váš výčet spíše určuje, jaké hodnoty jsou očekávány.
  • To také umožňuje IDE zvýraznit chyby, když předáte nesprávné hodnoty, a poskytnout podporu automatického dokončování.
  • V důsledku toho se váš kód stává typově bezpečným a méně pravděpodobně způsobí chyby za běhu.

Dále probereme, jak vytvořit výčty v Pythonu.

Jak vytvářet výčty v Pythonu

Python nemá nativní podporu pro výčty. Poskytuje však modul enums ve standardní knihovně. Tento modul použijeme v tomto tutoriálu. Existují také dvě metody pro vytváření výčtů v Pythonu: Classes nebo Function API. Oběma se budu věnovat v této části.

Předpoklady

Abyste mohli postupovat podle tohoto návodu, budete potřebovat nainstalovaný Python 3.4. Tato verze Pythonu je dodávána s modulem enum ve standardní knihovně. Pokud jste to ještě neudělali, zde je návod, který vám pomůže:

Abyste mohli postupovat podle návodu, budete potřebovat znát nějaký Python. To zahrnuje základní Python a pokročilejší koncepty objektově orientovaného programování, jako jsou třídy a dědičnost.

#1. Třídní metoda

První metodou pro vytváření výčtů je použití tříd. Nejprve importujete třídu enum z modulu enum. Dále vytvoříte svůj výčet vytvořením třídy. Tato třída zdědí třídu Enum, kterou jste importovali dříve.

from enum import Enum

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

Členům výčtu můžete také přiřadit libovolné hodnoty, které chcete. Zde je příklad: namísto přiřazení 0, 1, 2 a 3 našemu výčtu směrů přiřadíme jejich odpovídající hodnoty nadpisu 0, 90, 180 a 270.

from enum import Enum

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

Alternativně je použití funkce rozsahu stručnějším způsobem generování výše uvedeného. Níže uvedený fragment kódu ukazuje, jak:

from enum import Enum

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

V tomto případě generujeme hodnoty pomocí funkce range. Zadáváme 0 jako počáteční hodnotu, 360 jako koncovou hodnotu a 90 jako zvyšující se hodnotu. Destrukturujeme hodnoty z iterovatelného, ​​podobně jako destruujeme n-tice. Pokud si chcete přečíst více o destrukci n-tic, zde je článek o nicích v Pythonu.

Třídy Enum jsou abstraktní třídy. To znamená, že nejsou určeny k vytváření instance. Místo toho jsou jejich vlastnosti, které v tomto případě představují členy výčtu, přístupné přímo.

#2. Funkční metoda

Funkční metoda je alternativou k metodě podtřídění.

from enum import Enum

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

Ve výše uvedeném úryvku kódu jsme vytvořili výčet nazvaný Směr. Je přístupný pomocí čtyř členů, které jsme uvedli jako druhý argument. Ve výchozím nastavení mají tyto členy hodnoty od 1. Sever je tedy 1, východ je 2 a tak dále. Toto je tento případ a ne index založený na nule, jak se očekávalo, protože 0 je nepravda. Aby byly všechny hodnoty pravdivé, jsou hodnoty číslovány od 1.

Případně můžete svým členům přiřadit hodnoty předáním členů jako seznam n-tic. Každá n-tice obsahuje dva prvky: název člena a hodnotu tohoto člena.

from enum import Enum

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

Také si všimnete, že jsem při přiřazování hodnot členům ve výše uvedeném příkladu použil řetězce místo celých čísel. To ukazuje, že řetězce jsou při přiřazování hodnot stejně platné jako celá čísla.

Jak používat výčty

V předchozí části jsme se zabývali vytvářením výčtů a přiřazováním hodnot členům. Tato část se bude zabývat používáním výčtů pro přístup a přiřazení členů a kontrolu rovnosti.

Jak získat přístup k členům

Existuje několik metod pro přístup k členům výčtu. Patří mezi ně syntaxe tečky, závorky a syntaxe hranatých závorek. Zde je příklad, který demonstruje výše uvedené:

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

Po přístupu k členu výčtu jej můžete uložit do proměnné. Všimněte si, že přístup k členu vám poskytne odkaz na objekt člena, nikoli jeho hodnotu nebo název. To je důležité mít na paměti v několika následujících částech.

Přístup k názvu a hodnotě

Jak bylo zmíněno dříve, při přístupu k členu výčtu vytvoříte odkaz na objekt člena. Pokud chcete z nějakého důvodu získat přístup k názvu nebo hodnotě objektu enum, můžete použít vlastnosti name a value na objektu.

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

Kontrola rovnosti

Připomeňme, že přiřazení členu výčtu k proměnné vytvoří odkaz na člen výčtu. Proto, abychom zkontrolovali, zda má proměnná konkrétní člen výčtu, použijeme operátor is ke kontrole, zda člen výčtu a proměnná ukazují na stejný objekt.

Zde je příklad pro demonstraci:

today = Day.WEDNESDAY

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

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

Případně můžete použít operátor ==. Na nadtřídách třídy Enum je operátor == obalem pro operátor is. To se provádí pomocí přetížení operátora. Více si o tom můžete přečíst v tomto článku o Magických metodách. Každopádně zde je příklad, který používá == místo is.

today = Day.WEDNESDAY

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

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

S rizikem, že se budou opakovat, porovnávání výčtů kontroluje identitu objektu, nikoli hodnoty.

Závěrečná slova

Tento článek se zabýval tím, co jsou výčty a proč jsou užitečné. Také jsme se zabývali různými metodami vytváření výčtů podtřídou třídy Enum a použitím funkčního API.

Kromě toho jsme se zabývali tím, jak používat výčty, přistupovat k hodnotám a provádět srovnání. Dále si možná budete chtít přečíst náš článek o výčtech TypeScript.