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 vrednostTrue
,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
nijeTrue
, pokreće se izuzetakAssertionError
. poruka
je opciona niska. Možete definisati poruku koja će se prikazati u praćenju kada se pojavi izuzetakAssertionError
.
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
jeTrue
i dobija 10 poena više od trenutnogrezultat
. - 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 uzimamax_rezultat
kao parametar. - Proveravamo da li je
bonus
True
. Ako jeste, dodajemo 10 poena promenljivojrezultat
. - Zatim proveravamo da li je
rezultat
veći odmax_rezultat
. Ako jeste, vraćamomax_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 jeizraz
True
. Ako se ne proceni naTrue
, pokreće se izuzetakAssertionError
. - Takođe možete koristiti
assert
sa sintaksomassert izraz, poruka
. Ovo će ispisati niskuporuka
kad god se desi izuzetakAssertionError
. - 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.