Depanare eficientă cu declarația Python Assert

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,

  • expresie este 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 expresia se evaluează la True, instrucțiunea assert nu generează nicio eroare și nu returnează nimic. Acest lucru indică faptul că programul funcționează conform așteptărilor.
  • Dacă expresia nu mai este adevărată, se declanșează o excepție de tip AssertionError.
  • mesajul este 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ție AssertionError.

Î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, bonus este True ș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_score primește și max_score ca parametru.
  • Verificăm dacă bonus este True. Dacă este adevărat, adăugăm 10 puncte la variabila score.
  • Apoi, verificăm dacă score este mai mare decât max_score. Dacă da, returnăm max_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ă la True, este generată o excepție AssertionError.
  • Poți utiliza, de asemenea, assert cu sintaxa assert expresie, mesaj. Acest lucru va afișa șirul mesaj ori de câte ori apare o excepție AssertionError.
  • 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.