Jak wyliczenia w Pythonie poprawiają czytelność kodu

Photo of author

By maciekx

Wyliczenia stanowią popularny rodzaj danych w wielu językach programowania, takich jak C, C++ oraz Java. Ułatwiają pisanie kodu, który jest bezpieczny pod względem typów i jednocześnie bardziej zrozumiały.

W języku Python, obsługa wyliczeń nie była dostępna od początku. Dopiero wersja 3.4 wprowadziła ich wsparcie. W niniejszym artykule przyjrzymy się, jak tworzyć i używać wyliczeń, a także w jaki sposób podnoszą one czytelność kodu.

Czym są wyliczenia i jakie jest ich zastosowanie?

Wyliczenie, znane również jako enum, to typ danych, który jest określony poprzez zestaw dopuszczalnych wartości. Ten zbiór wartości jest nazywany zbiorem jego elementów. Wyliczenia pozwalają na precyzyjne zdefiniowanie zakresu wartości, które może przyjmować zmienna. W ten sposób kod staje się bezpieczniejszy pod względem typów, a także bardziej przejrzysty.

Kluczowe pojęcia związane z wyliczeniami

Zanim przejdziemy do szczegółów, warto wyjaśnić kilka terminów, które będą często używane w dalszej części artykułu. Są to elementy (członkowie) oraz ich wartości.

  • Elementy (członkowie): To nazwane stałe, które składają się na zbiór wartości przynależnych do danego wyliczenia. Przykładowo, wyliczenie reprezentujące dni tygodnia może zawierać elementy takie jak: niedziela, poniedziałek, wtorek, i tak dalej.
  • Wartości: Są to wartości numeryczne lub tekstowe używane wewnętrznie do reprezentowania poszczególnych elementów wyliczenia. Umożliwiają one porównywanie elementów. Na przykład, w wyliczeniu dni tygodnia, niedziela może mieć wartość 0, poniedziałek 1, wtorek 2, itd.

Teraz omówimy, w jaki sposób wyliczenia usprawniają tworzony kod.

W jaki sposób wyliczenia ulepszają kod?

Wyliczenia czynią kod bardziej zrozumiałym i mniej podatnym na błędy. Oto kilka korzyści wynikających z ich stosowania:

  • Wyliczenia umożliwiają jasne określenie, jakiego rodzaju wartości oczekuje dany argument funkcji lub zmiennej. Zastosowanie wyliczeń precyzuje zamysł autora kodu, co ułatwia jego zrozumienie innym programistom.
  • Wyliczenia sprawiają, że kod jest bardziej samodokumentujący się. Nie ma potrzeby dodawania obszernych komentarzy, aby wyjaśnić, jakie wartości są akceptowane przez funkcję. Samo wyliczenie wskazuje, jakich wartości się oczekuje.
  • W środowiskach programistycznych IDE wyliczenia umożliwiają wychwytywanie błędów w przypadku przekazywania nieprawidłowych wartości, a także oferują wsparcie dla autouzupełniania.
  • W rezultacie kod staje się bezpieczniejszy pod względem typów, a ryzyko wystąpienia błędów w czasie działania programu jest znacznie mniejsze.

W dalszej kolejności przeanalizujemy, jak tworzyć wyliczenia w Pythonie.

Jak tworzyć wyliczenia w Pythonie?

Python nie posiada wbudowanej obsługi wyliczeń. Jednak w bibliotece standardowej udostępniony jest moduł „enum”, który umożliwia ich tworzenie. W ramach tego artykułu będziemy korzystać z tego modułu. Istnieją dwie metody tworzenia wyliczeń: przy użyciu klas oraz za pomocą API funkcji. Obie te metody zostaną omówione w tej sekcji.

Wymagania wstępne

Aby skorzystać z tego artykułu, wymagana jest instalacja Pythona w wersji 3.4 lub nowszej. Ta wersja Pythona zawiera moduł „enum” w bibliotece standardowej. Jeśli nie masz jeszcze zainstalowanego Pythona, możesz poszukać odpowiednich tutoriali w sieci.

Konieczna jest również podstawowa znajomość języka Python. Obejmuje to zarówno podstawowe koncepty tego języka, jak i zaawansowane zagadnienia programowania obiektowego, takie jak klasy oraz dziedziczenie.

#1. Metoda wykorzystująca klasy

Pierwszym sposobem na utworzenie wyliczenia jest użycie klas. Najpierw należy zaimportować klasę „Enum” z modułu „enum”. Następnie tworzymy wyliczenie poprzez zdefiniowanie klasy, która dziedziczy po wcześniej zaimportowanej klasie „Enum”.

from enum import Enum

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

Możemy również przypisać dowolne wartości poszczególnym elementom wyliczenia. W poniższym przykładzie, zamiast przypisywać wartości 0, 1, 2 i 3 do wyliczenia kierunków, przypisujemy im wartości odpowiadające kątom w stopniach: 0, 90, 180 i 270.

from enum import Enum

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

Alternatywnie, można wykorzystać funkcję „range” w bardziej zwięzły sposób, aby wygenerować powyższy przykład. Poniższy kod ilustruje, jak to zrobić:

from enum import Enum

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

W tym przypadku, wartości generowane są za pomocą funkcji „range”. Funkcja ta przyjmuje 0 jako wartość początkową, 360 jako wartość końcową, i 90 jako krok. Wartości są następnie rozpakowywane z iterowalnego obiektu, podobnie jak ma to miejsce w przypadku krotek. Jeśli chcesz dowiedzieć się więcej na temat rozpakowywania krotek, możesz przeczytać artykuł poświęcony krotkom w Pythonie.

Klasy reprezentujące wyliczenia są klasami abstrakcyjnymi. Oznacza to, że nie powinniśmy tworzyć ich instancji. Zamiast tego, dostęp do ich właściwości, które w tym przypadku reprezentują elementy wyliczenia, można uzyskać bezpośrednio.

#2. Metoda wykorzystująca funkcję

Alternatywą dla tworzenia wyliczeń za pomocą klas jest wykorzystanie metody funkcyjnej.

from enum import Enum

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

W powyższym przykładzie stworzyliśmy wyliczenie o nazwie „Direction”. Dostęp do jego elementów można uzyskać przy pomocy nazw podanych jako drugi argument. Domyślnie elementom tym przypisywane są wartości rozpoczynające się od 1. Oznacza to, że północ ma wartość 1, wschód 2, i tak dalej. Wartość ta jest przypisywana od 1, a nie od 0, ponieważ 0 reprezentuje wartość fałszywą. W związku z tym, aby wszystkie wartości były uznawane za prawdziwe, numery zaczynają się od 1.

Możliwe jest również przypisanie własnych wartości elementom poprzez przekazanie ich jako listy krotek. Każda krotka składa się z dwóch elementów: nazwy elementu oraz jego wartości.

from enum import Enum

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

W powyższym przykładzie, do przypisania wartości elementom, użyliśmy ciągów znaków zamiast liczb całkowitych. Pokazuje to, że przypisywanie wartości za pomocą ciągów znaków jest równie poprawne, co używanie liczb całkowitych.

Jak korzystać z wyliczeń?

W poprzedniej sekcji omówiliśmy sposób tworzenia wyliczeń i przypisywania im wartości. W tej sekcji, przyjrzymy się, jak używać wyliczeń do uzyskiwania dostępu i przypisywania elementów, a także jak sprawdzać ich równość.

Jak uzyskać dostęp do elementów?

Istnieje kilka sposobów uzyskiwania dostępu do elementów wyliczenia. Można to zrobić za pomocą notacji kropkowej, nawiasów lub nawiasów kwadratowych. Poniżej przedstawiono przykłady ilustrujące każdą z tych metod:

from enum import Enum

# Tworzenie wyliczenia
class Day(Enum):
    SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY = range(1, 8)

# Dostęp do elementów wyliczenia
# 1. Użycie notacji kropkowej
print(Day.SUNDAY)

# 2. Użycie nawiasów kwadratowych
print(Day["MONDAY"])

# 3. Użycie nawiasów okrągłych
print(Day(3))

Po uzyskaniu dostępu do elementu wyliczenia, można przypisać go do zmiennej. Należy pamiętać, że dostęp do elementu wyliczenia zwraca referencję do obiektu elementu, a nie jego wartość lub nazwę. Jest to ważne w kontekście kolejnych sekcji.

Dostęp do nazwy i wartości

Jak wspomniano wcześniej, uzyskanie dostępu do elementu wyliczenia zwraca odwołanie do obiektu elementu. Jeżeli z jakiegoś powodu chcemy uzyskać dostęp do nazwy lub wartości obiektu wyliczenia, możemy skorzystać z właściwości „name” i „value”.

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

Sprawdzanie równości

Warto przypomnieć, że przypisanie elementu wyliczenia do zmiennej tworzy referencję do obiektu tego elementu. W związku z tym, aby sprawdzić, czy zmienna przechowuje konkretny element wyliczenia, używamy operatora „is”, który porównuje, czy zmienna i element wyliczenia wskazują na ten sam obiekt.

Poniżej przedstawiono przykład, który to ilustruje:

today = Day.WEDNESDAY

if today is Day.MONDAY:
    print("To poniedziałek, :(")

if today is Day.WEDNESDAY:
    print("Miłej środy")

Alternatywnie można użyć operatora „==”. W nadklasie „Enum”, operator „==” jest opakowaniem dla operatora „is”. Odbywa się to poprzez przeciążenie operatora. Więcej na ten temat można przeczytać w artykule poświęconym magicznym metodom. W poniższym przykładzie zastosowano operator „==” zamiast „is”.

today = Day.WEDNESDAY

if today == Day.MONDAY:
    print("To poniedziałek, :(")

if today == Day.WEDNESDAY:
    print("Miłej środy")

Podkreślając ten aspekt raz jeszcze, porównania wyliczeń sprawdzają tożsamość obiektów, a nie ich wartości.

Podsumowanie

W niniejszym artykule wyjaśniono, czym są wyliczenia oraz dlaczego warto ich używać. Omówiono również różne metody tworzenia wyliczeń, zarówno poprzez dziedziczenie po klasie „Enum”, jak i przy użyciu funkcjonalnego interfejsu API.

Ponadto, przedstawiono sposób wykorzystania wyliczeń, uzyskiwania dostępu do ich wartości i przeprowadzania porównań. Następnie, można przeczytać nasz artykuł poświęcony wyliczeniom w języku TypeScript.


newsblog.pl