Ești un programator? Atunci, depanarea este o competență esențială, indiferent de limbajul de programare pe care îl utilizezi. În acest material, vei descoperi cum să te folosești de instrucțiunea assert în Python pentru o depanare eficientă.
Când dezvolți un proiect, vei configura numeroase module, incluzând funcții, definiții de clase și multe altele. Este foarte posibil să te confrunți cu erori sau rezultate neașteptate din cauza unor greșeli în implementare. Instrucțiunile assert sunt utile în depanarea unui astfel de cod.
În acest tutorial, vei învăța sintaxa pentru a folosi instrucțiunea assert, urmată de exemple concrete pentru a vedea cum funcționează. Vom analiza, de asemenea, ce sunt erorile de aserțiune și cum le putem utiliza pentru a identifica și remedia erorile din cod în timpul dezvoltării.
Să începem!
Cum să folosești instrucțiunea Assert în Python
Vom începe cu sintaxa instrucțiunii assert și apoi vom continua cu câteva exemple de cod.
Sintaxa instrucțiunii Assert
Să analizăm sintaxa pentru a utiliza instrucțiunea assert în Python:
assert expresie, mesaj
Aici,
expresieeste orice expresie validă în Python care trebuie evaluată. Aceasta poate fi o condiție referitoare la valoarea unei variabile, valoarea de adevăr a unei variabile, valoarea returnată de o funcție și multe altele.- Atâta timp cât
expresiase evaluează laTrue, instrucțiunea assert nu generează nicio eroare și nu returnează nimic. Acest lucru indică faptul că programul funcționează conform așteptărilor. - Dacă
expresianu mai este adevărată, se declanșează o excepție de tipAssertionError. mesajuleste un șir de caractere opțional. Poți specifica un mesaj care va fi afișat în timpul urmăririi ori de câte ori se generează o excepțieAssertionError.
În continuare, haide să analizăm câteva exemple în care instrucțiunea assert ne poate ajuta să scriem cod mai curat și mai fiabil.
Poți găsi exemplele de cod folosite în acest tutorial în acest depozit GitHub.
Exemple de utilizare a declarațiilor assert în Python
Să ne uităm la următorul exemplu. Să presupunem că ai o variabilă care reprezintă reducerea în codul tău. Vrei ca această valoare să fie întotdeauna mai mică sau egală cu max_discount.
Pentru a verifica dacă nu ai setat accidental variabila discount la o valoare greșită, poți adăuga o afirmație (assert). Expresia care trebuie evaluată este: discount <= max_discount.
>>> max_discount = 50 >>> discount = 20 >>> assert discount <= max_discount
În acest caz, discount (20) este mai mic decât max_discount (50), deci instrucțiunea assert nu generează nicio eroare.
Excepția AssertionError
Dacă variabila discount este setată la o valoare mai mare decât max_discount, se generează o excepție AssertionError.
>>> discount = 75 >>> assert discount <= max_discount Traceback (most recent call last): File "<stdin>", line 1, in <module> AssertionError
Instrucțiunea assert ne permite, de asemenea, să specificăm un șir de caractere ca mesaj opțional.
Să adăugăm un mesaj care oferă informații de diagnosticare mai detaliate. Vom include un șir f-string în declarația assert, care conține valorile discount și max_discount.
>>> assert discount <= max_discount, f"discount should be at most {max_discount}; got discount = {discount}"
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AssertionError: discount should be at most 50; got discount = 75
Așa cum se vede în rezultatul de mai sus, excepția AssertionError include acum valorile variabilelor discount și max_discount.
Depanarea și testarea funcțiilor Python cu assert
Când definești funcții, uneori poți introduce, fără să vrei, erori (erori logice) care vor împiedica funcția să funcționeze corect.
Să luăm un exemplu. Să presupunem că există un test într-o clasă și studenții pot încerca o întrebare bonus. Orice student care încearcă întrebarea bonus va primi 10 puncte suplimentare la test. 😄
Să analizăm următoarea funcție get_final_score:
- Funcția primește ca parametru un scor curent și o valoare booleană
bonus. - Dacă un student a răspuns la întrebarea bonus,
bonusesteTrueși primește 10 puncte adăugătoare la scorul actual. - Funcția returnează apoi scorul final.
def get_final_score(score,bonus):
if bonus:
score += 10
return score
Să apelăm funcția de câteva ori. Vedem că pentru scorurile de 34 și 40 cu bonus setat la True și False, scorurile finale sunt 44, respectiv 40.
print(get_final_score(34,True)) # 44 print(get_final_score(40,False)) # 40
Cu toate acestea, punctajul maxim la test este, să zicem, 50. Deci, dacă un student obține 49 și a răspuns și la întrebarea bonus, funcția get_final_score va calcula cu entuziasm scorul final ca fiind 59.
print(get_final_score(49,True)) # 59
Din punct de vedere tehnic, acest lucru este posibil. Dar, să presupunem că un elev nu poate obține mai mult decât punctajul maxim posibil la test. 🙂
Să inițializăm o variabilă max_score și să stocăm scorul returnat de funcție în variabila final_score.
Ulterior, adăugăm o afirmație (assert) care verifică dacă final_score este mai mic sau egal cu max_score.
def get_final_score(score,bonus):
if bonus:
score += 10
return score
final_score = get_final_score(47,True)
max_score = 50
assert final_score <= max_score
Acum primim o excepție AssertionError la apelul de funcție get_final_score(47,True):
Traceback (most recent call last):
File "main.py", line 17, in <module>
assert final_score <= max_score
AssertionError
Acum, adăugăm un șir f-string detaliat la instrucțiunea assert:
assert final_score <= max_score,f"final_score should be at most {max_score}; got {final_score}"
Traceback (most recent call last):
File "main.py", line 17, in <module>
assert final_score <= max_score,f"final_score should be at most {max_score}; got {final_score}"
AssertionError: final_score should be at most 50; got 57
Modificarea funcției
Să ne întoarcem și să modificăm definiția funcției get_final_score pentru a remedia comportamentul neașteptat:
- Funcția
get_final_scoreprimește șimax_scoreca parametru. - Verificăm dacă
bonusesteTrue. Dacă este adevărat, adăugăm 10 puncte la variabilascore. - Apoi, verificăm dacă
scoreeste mai mare decâtmax_score. Dacă da, returnămmax_score. - În caz contrar, returnăm
score.
Acum ne-am asigurat că scorul final este întotdeauna mai mic sau egal cu max_score.
def get_final_score(score,bonus,max_score):
if bonus:
score += 10
if score > max_score:
return max_score
return score
Ca exercițiu rapid, scrie câteva afirmații pentru a confirma că funcția funcționează acum așa cum era de așteptat.
O notă despre excepția AssertionError
Deși o excepție AssertionError apare atunci când expresia se evaluează la False, trebuie să reținem că nu ar trebui să tratăm aceste erori ca excepții standard. Aceasta înseamnă că nu ar trebui să facem ceva de genul:
try:
<doing this>
except AssertionError:
<do this>
În exemplul anterior despre get_final_score, am utilizat instrucțiunea assert pentru a verifica dacă final_score este mai mic decât max_score. Apoi, am modificat definiția funcției, astfel încât să nu mai existe erori de aserțiune.
Acesta este scopul instrucțiunilor assert. Sunt verificări pentru cod și ajută la scrierea unui cod mai corect. Gestionarea excepțiilor, pe de altă parte, este despre anticiparea și gestionarea erorilor neașteptate în timpul execuției. Acestea includ adesea tipuri și valori de intrare nevalide.
Pentru a rezuma, ar trebui să utilizezi instrucțiunea assert din Python pentru o depanare eficientă și să nu gestionezi AssertionErrors ca excepții standard.
Concluzie
Acest tutorial te-a ajutat să înțelegi cum să utilizezi instrucțiunea assert în Python. Iată un rezumat al celor învățate:
- Instrucțiunile Python assert (aserțiuni) au forma
assert expresie. Aceasta verifică dacă expresia este adevărată. Dacă nu se evaluează laTrue, este generată o excepțieAssertionError. - Poți utiliza, de asemenea, assert cu sintaxa
assert expresie, mesaj. Acest lucru va afișa șirulmesajori de câte ori apare o excepțieAssertionError. - Trebuie să reții să nu implementezi gestionarea excepțiilor pentru a gestiona erorile de aserțiune. Folosește afirmațiile ca un instrument util de depanare pentru verificările corecte ale codului tău.
Ca dezvoltator, afirmațiile te ajută la depanare. Pentru a te asigura că toate componentele (modulele) individuale ale proiectului funcționează conform așteptărilor, poți învăța cum să scrii teste unitare în Python.
Apoi, consultă această listă de proiecte Python pentru începători la care poți lucra.