Ефикасно отклањање грешака помоћу изјаве Питхон Ассерт

Jeste li programer? Ako jeste, otklanjanje grešaka je ključna veština, bez obzira na programski jezik koji koristite. U ovom članku ćete naučiti kako da koristite naredbu assert u Pythonu za efikasno rešavanje problema.

Tokom rada na projektu, definisaćete više modula. To uključuje funkcije, definicije klasa i još mnogo toga. Vrlo je verovatno da ćete se suočiti sa greškama ili neočekivanim rezultatima zbog nepravilne implementacije. U takvim slučajevima, assert izjave su veoma korisne pri otklanjanju grešaka.

U ovom vodiču, istražićemo sintaksu za korišćenje assert izjave, a zatim ćemo je demonstrirati na primerima koda. Takođe ćemo objasniti šta su greške asertacije i kako se mogu koristiti za ispravljanje grešaka u kodu tokom razvoja.

Započnimo!

Kako koristiti assert izjavu u Pythonu

Proučićemo sintaksu za korišćenje naredbe assert, a nakon toga ćemo nastaviti sa pisanjem nekoliko primera.

Sintaksa assert izjave

Počnimo sa sintaksom za korišćenje assert izjave u Pythonu:

assert izraz, poruka

Gde:

  • izraz je bilo koji validan Python izraz koji treba da se proceni. To može biti uslov za vrednost promenljive, istinita vrednost promenljive, povratna vrednost funkcije i još mnogo toga.
  • Sve dok izraz ima vrednost True, assert izjava ne generiše grešku niti vraća bilo šta. Ovo ukazuje na to da program radi kako se očekuje.
  • Ako izraz nije True, pokreće se izuzetak AssertionError.
  • poruka je opciona niska. Možete definisati poruku koja će se prikazati u praćenju kada se pojavi izuzetak AssertionError.

Zatim, pređimo na nekoliko primera gde nam assert izjava može pomoći da napišemo čistiji kod bez grešaka.

Primeri koda koji se koriste u ovom vodiču mogu se naći na ovom GitHub repozitorijumu.

Primeri Python assert izjava

Razmotrite sledeći primer. Pretpostavimo da imate promenljivu popust u kodu. Međutim, želite da njena vrednost uvek bude manja ili jednaka max_popust.

Da biste proverili da slučajno niste postavili promenljivu popust na vrednost veću od dozvoljene, možete dodati asertaciju. Izraz za procenu je: popust <= max_popust.

>>> max_popust = 50
>>> popust = 20
>>> assert popust <= max_popust

Ovde je popust (20) manji od max_popust (50). Dakle, assert izjava ne generiše nikakvu grešku.

Izuzetak AssertionError

Ako je promenljiva popust postavljena na vrednost veću od max_popust, pokreće se izuzetak AssertionError.

>>> popust = 75
>>> assert popust <= max_popust
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AssertionError

Znamo da nam assert izjava takođe omogućava da definišemo opcionu nisku poruke.

Hajde da iskoristimo nisku poruke koja pruža detaljnije dijagnostičke informacije. U assert naredbu, dodajmo Python f-string koji takođe sadrži vrednosti popust i max_popust.

>>> assert popust <= max_popust, f"popust treba da bude najviše {max_popust}; dobijeno popust = {popust}"
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AssertionError: popust treba da bude najviše 50; dobijeno popust = 75

Kao što se vidi u izlazu, izuzetak AssertionError sada uključuje vrednosti promenljivih popust i max_popust.

Otklanjanje grešaka i testiranje Python funkcija pomoću assert

Prilikom definisanja funkcija, ponekad možete nenamerno uneti greške (logičke greške) koje će sprečiti vašu funkciju da radi kako je predviđeno.

Uzmimo primer. Pretpostavimo da postoji test u razredu i da učenici imaju šansu da pokušaju sa dodatnim pitanjem. Svaki učenik koji pokuša da odgovori na bonus pitanje, dobija dodatnih 10 poena na testu. 😄

Razmotrite sledeću funkciju get_final_score:

  • Uzima trenutni rezultat, bonus (boolean vrednost).
  • Ako je učenik odgovorio na bonus pitanje, boolean bonus je True i dobija 10 poena više od trenutnog rezultat.
  • Funkcija zatim vraća konačni rezultat.
def get_final_score(rezultat, bonus):
    if bonus:
        rezultat += 10
    return rezultat

Napravimo nekoliko poziva funkcije. Vidimo da su za rezultate 34 i 40 sa bonus postavljenim na True i False, konačni rezultati 44 i 40, respektivno.

print(get_final_score(34, True))
# 44
print(get_final_score(40, False))
# 40

Međutim, maksimalan broj poena na testu je, recimo, 50. Dakle, ako učenik postigne 49 i takođe je odgovorio na bonus pitanje, funkcija get_final_score će izračunati konačni rezultat kao 59.

print(get_final_score(49, True))
# 59

Tehnički, to je moguće. Ali, pretpostavimo da učenik ne može da postigne više od maksimalnog broja poena za test. 🙂

Dakle, inicijalizujmo promenljivu max_rezultat. I sačuvajmo povratnu vrednost funkcije u promenljivu final_rezultat.

Nakon toga dodajemo asertaciju koja proverava da li je final_rezultat manji ili jednak max_rezultat.

def get_final_score(rezultat, bonus):
    if bonus:
        rezultat += 10
    return rezultat

final_rezultat = get_final_score(47, True)
max_rezultat = 50

assert final_rezultat <= max_rezultat

Sada dobijamo izuzetak AssertionError za poziv funkcije get_final_score(47, True):

Traceback (most recent call last):
  File "main.py", line 17, in <module>
    assert final_rezultat <= max_rezultat
AssertionError

Sada dodajemo opisni f-string u Python naredbu assert:

assert final_rezultat <= max_rezultat, f"final_rezultat treba da bude najviše {max_rezultat}; dobijeno {final_rezultat}"
Traceback (most recent call last):
  File "main.py", line 17, in <module>
    assert final_rezultat <= max_rezultat,f"final_rezultat treba da bude najviše {max_rezultat}; dobijeno {final_rezultat}"
AssertionError: final_rezultat treba da bude najviše 50; dobijeno 57

Izmena funkcije

Vratimo se i izmenimo definiciju funkcije get_final_score da popravimo neočekivano ponašanje:

  • Funkcija get_final_score takođe uzima max_rezultat kao parametar.
  • Proveravamo da li je bonus True. Ako jeste, dodajemo 10 poena promenljivoj rezultat.
  • Zatim proveravamo da li je rezultat veći od max_rezultat. Ako jeste, vraćamo max_rezultat.
  • U suprotnom, vraćamo rezultat.

Sada smo osigurali da konačni rezultat uvek bude manji ili jednak max_rezultat.

def get_final_score(rezultat, bonus, max_rezultat):
    if bonus:
        rezultat += 10
    if rezultat > max_rezultat:
        return max_rezultat
    return rezultat

Kao brzu vežbu, napišite nekoliko asertacija da potvrdite da funkcija sada radi kako se očekuje.

Napomena o izuzetku AssertionError

Iako se izuzetak AssertionError javlja kada se izraz proceni na False, treba da zapamtimo da takve greške ne tretiramo kao obične izuzetke. To znači da ne treba raditi nešto poput sledećeg:

try:
    <radnja>
except AssertionError:
    <radnja ako dođe do greške>

U prethodnom primeru o get_final_score, koristili smo asertaciju da proverimo da li je final_rezultat manji od max_rezultat. Zatim smo modifikovali definiciju funkcije tako da nema grešaka u asertaciji.

To je upravo čemu asertacije služe. One su provere ispravnosti koda i pomoć u pisanju čistijeg koda. Sa druge strane, rukovanje izuzecima je predviđanje i rešavanje neočekivanih grešaka tokom izvršavanja. One često uključuju nevažeće tipove i vrednosti ulaza.

Ukratko, treba da koristite Python assert naredbu za efikasno otklanjanje grešaka i ne tretirate AssertionError kao izuzetke za rukovanje tokom izvršavanja.

Zaključak

Ovaj vodič vam je pomogao da razumete kako da koristite assert izjavu u Pythonu. Evo rezimea onoga što ste naučili:

  • Python asertacije imaju oblik assert izraz. Ovo proverava da li je izraz True. Ako se ne proceni na True, pokreće se izuzetak AssertionError.
  • Takođe možete koristiti assert sa sintaksom assert izraz, poruka. Ovo će ispisati nisku poruka kad god se desi izuzetak AssertionError.
  • Trebalo bi da zapamtite da ne implementirate rukovanje izuzecima da biste rešili greške u asertaciji. I koristite asertacije kao koristan alat za otklanjanje grešaka i proveru ispravnosti vašeg koda.

Kao programeru, asertacije vam pomažu u otklanjanju grešaka. Da biste osigurali da sve pojedinačne komponente (moduli) projekta rade kako se očekuje, možete naučiti kako pisati jedinične testove u Pythonu.

Zatim pogledajte ovu listu početničkih Python projekata na kojima možete raditi.