Programowanie w języku Python staje się coraz popularniejsze wśród developperów. Język ten oferuje wiele przydatnych narzędzi i technik, które pomagają tworzyć niezawodny i poprawny kod. Jedną z takich technik jest programowanie asertywne, które pozwala na wczesne wykrywanie błędów i ułatwia debugowanie.
Zastosowanie asertywności w Pythonie
Asercje w Pythonie to proste instrukcje, które pozwalają na sprawdzenie, czy założenia dotyczące programu są spełnione w danym momencie działania. Służą głównie do weryfikowania poprawności argumentów funkcji, sprawdzania stanu obiektów oraz ogólnie zapewnienia, że program działa zgodnie z oczekiwaniami.
Programiści wykorzystują asercje w Pythonie najczęściej w następujących sytuacjach:
Sprawdzanie danych wejściowych
Asercje pozwalają szybko zweryfikować, czy parametry przekazywane do funkcji mają oczekiwany typ, zakres wartości i spełniają inne wymagania. Pozwala to wychwycić błędne dane na wczesnym etapie.
Weryfikacja wyników obliczeń
Można użyć asercji do sprawdzenia, czy wyniki krytycznych obliczeń są poprawne i zgodne z oczekiwaniami. Pozwala to szybko zidentyfikować ewentualne błędy w logice programu.
Testy jednostkowe
Asercje są nieodłącznym elementem testów jednostkowych, gdzie służą do weryfikacji poprawności wyników poszczególnych metod i funkcji. Pozwalają szybko wykryć regresje.
Tworzenie asertywnych funkcji i metod
Sprawdzanie poprawności argumentów funkcji
Bardzo przydatne jest sprawdzanie za pomocą asercji, czy argumenty przekazywane do funkcji mają poprawne typy i wartości. Pozwala to wychwycić wiele potencjalnych błędów już na starcie:
def dodaj(a, b):
assert isinstance(a, int), "a musi być liczbą całkowitą"
assert isinstance(b, int), "b musi być liczbą całkowitą"
assert a >= 0, "a musi być nieujemne"
return a + b
Wykorzystanie asercji do sprawdzania stanu
Asercje mogą służyć do weryfikowania, czy obiekty są w poprawnym stanie w danym momencie działania programu:
def metoda(obiekt):
assert obiekt.stan == "otwarty", "Niepoprawny stan obiektu"
# reszta metody
Ograniczenia i zalety asercji
Należy pamiętać, że asercje nie zastępują obsługi wyjątków. Służą jedynie do weryfikacji stanu w trakcie developmentu. Nie powinny mieć żadnych efektów ubocznych. Ich główne zalety to prostota użycia i możliwość szybkiego wykrywania błędów.
Czytaj więcej: 10 zasad pisania czystego kodu w Pythonie
Obsługa błędów asercji
Obsługa wyjątków AssertionError
Gdy warunek w asercji nie zostanie spełniony, interpreter Pythona zgłosi wyjątek AssertionError. Można go przechwycić i obsłużyć tak jak inne wyjątki:
try:
assert 2 + 2 == 5
except AssertionError:
print("Wystąpił błąd w asercji!")
Raportowanie niepowodzeń asercji
Możliwe jest dostosowanie komunikatu błędu z asercji, aby ułatwić debugowanie. Wystarczy przekazać wiadomość jako drugi argument:
wartosc = 2
assert wartosc == 2, "Oczekiwano wartości 2, otrzymano: {0}".format(wartosc)
Konfigurowanie zachowania asercji
Można wyłączyć sprawdzanie warunków asercji za pomocą opcji -O przy uruchamianiu skryptu. Jest to przydatne np. po opublikowaniu kodu, gdy debugowanie nie jest już potrzebne.
Przykłady użycia asercji

Walidacja danych wejściowych
def oblicz_premie(platności):
assert isinstance(platności, list), "Niepoprawny typ danych"
for placa in platności:
assert placa > 0, "Pensje muszą być dodatnie"
# reszta funkcji
Weryfikacja poprawności obliczeń
def policz_sume(elementy):
suma = sum(elementy)
assert suma == sum(elementy), "Błąd w obliczeniach sumy"
return suma
Testy jednostkowe z asercjami
import unittest
class TestSumy(unittest.TestCase):
def test_dodawania(self):
self.assertEqual(1 + 1, 2)
def test_odejmowania(self):
self.assertEqual(5 - 3, 2)
Najlepsze praktyki
Umieszczanie asercji blisko potencjalnych błędów
Należy umieszczać asercje jak najbliżej fragmentów kodu, w których mogą pojawić się błędy. Ułatwi to znalezienie źródła problemu.
Unikanie efektów ubocznych w asercjach
Asercje powinny jedynie sprawdzać stan programu, bez wywoływania żadnych dodatkowych akcji czy efektów ubocznych.
Pisanie czytelnych komunikatów asercji
Komunikaty w asercjach powinny jasno wskazywać przyczynę niepowodzenia i ułatwiać zrozumienie problemu.
Podsumowanie i wnioski
Podsumowując, programowanie asertywne to bardzo przydatna technika, która pozwala znacząco zwiększyć niezawodność kodu Python. Dzięki asercjom możliwe jest szybkie wykrywanie błędów już podczas developmentu. Asercje sprawdzają założenia programisty na temat poprawności kodu i pozwalają zweryfikować jego poprawne działanie. W połączeniu z testami jednostkowymi, asertywność może znacząco podnieść jakość kodu.