Depanare eficientă cu declarația Python Assert

Esti programator? Dacă da, depanarea este o abilitate esențială, indiferent de limba în care codificați. În acest articol, veți învăța cum să utilizați declarația assert în Python pentru o depanare eficientă.

Când lucrați la un proiect, veți defini mai multe module. Aceasta include funcții, definiții de clasă și multe altele. Și probabil că veți întâlni erori sau rezultate neașteptate din cauza unei erori în implementare. Declarațiile Assert sunt utile în depanarea unui astfel de cod.

În acest tutorial, vom învăța sintaxa pentru a folosi instrucțiunea assert urmată de exemple de cod pentru a o vedea în acțiune. Vom vedea, de asemenea, ce sunt erorile de afirmare și cum le putem folosi pentru a remedia erorile din cod în timpul dezvoltării.

Sa incepem!

Cum să utilizați declarația Assert în Python

Vom învăța sintaxa pentru a folosi instrucțiunea assert, apoi vom continua să codificăm câteva exemple.

Sintaxa declarației Assert

Să începem cu sintaxa pentru a folosi instrucțiunea assert în Python:

assert expression, message

Aici,

  • expresie este orice expresie Python validă care trebuie evaluată. Aceasta poate fi o condiție privind valoarea variabilei, valoarea de adevăr a variabilei, valoarea returnată de la o funcție și multe altele.
  • Atâta timp cât expresia se evaluează la True, instrucțiunea assert nu aruncă o eroare și nu returnează nimic. Acest lucru indică faptul că programul funcționează conform așteptărilor.
  • Dacă expresia nu mai este adevărată, este generată o excepție AssertionError.
  • mesajul este un șir opțional. Puteți specifica un mesaj care va fi afișat în urmărire ori de câte ori este ridicată o excepție AssertionError.

În continuare, haideți să codificăm câteva exemple în care declarația assert ne poate ajuta să scriem cod mai curat și fără erori.

  5 moduri de a accelera Ubuntu

Puteți găsi exemplele de cod folosite în acest tutorial în acest articol GitHub.

Exemple de declarații de afirmare a lui Python

Luați în considerare următorul exemplu. Să presupunem că aveți o variabilă de reducere în cod. Dar ați dori ca valoarea sa să fie întotdeauna mai mică sau egală cu max_discount.

Pentru a verifica dacă nu ați setat din greșeală variabila de reducere la o valoare, puteți adăuga o afirmație. Expresia de evaluat este: discount <= max_discount.

>>> max_discount = 50
>>> discount = 20
>>> assert discount <= max_discount

Aici, discount (20) este mai mic decât max_discount (50). Deci declarația assert nu aruncă nicio eroare.

Excepția AssertionError

Dacă variabila discount este setată la o valoare mai mare decât max_discount, este generată o excepție AssertionError.

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

Știm că declarația assert ne permite, de asemenea, să specificăm un șir de mesaj opțional.

Să folosim, de asemenea, un șir de mesaje care oferă informații de diagnosticare mai descriptive. La declarația assert, să adăugăm un șir f Python care conține, de asemenea, 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

După cum se vede în celula de ieșire de mai sus, excepția AssertionError include acum valorile variabilelor discount și max_discount.

Depanarea și testarea funcțiilor Python cu Assert

Când definiți funcții, uneori puteți introduce din neatenție erori (erori logice) care vă vor împiedica funcția să funcționeze conform intenției.

Să luăm un exemplu. Să presupunem că există un test într-o clasă și studenților li se oferă șansa de a încerca o întrebare bonus. Orice student care încearcă întrebarea bonus va primi 10 puncte suplimentare la test. 😄

  Cum să resetați conexiunea la rețea a lui Roku

Luați în considerare următoarea funcție get_final_score:

  • Acesta include un scor curent, un scor și un bonus boolean.
  • Dacă un student a răspuns la întrebarea bonus, bonusul boolean este adevărat și primește cu 10 puncte mai mult decât scorul actual.
  • Funcția returnează apoi scorul final.
def get_final_score(score,bonus):
    if bonus:
        score += 10
    return score

Să facem câteva apeluri la funcție. Vedem că pentru scorurile de 34 și 40 cu bonusul setat la Adevărat și Fals, scorurile finale sunt 44 și, respectiv, 40.

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

Cu toate acestea, punctele maxime ale testului sunt, 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 bucurie scorul final ca fiind 59.

print(get_final_score(49,True))
# 59

Tehnic, este posibil. Dar să presupunem că un elev nu poate obține mai mult de punctele maxime posibile pentru test. 🙂

Deci, să inițializam o variabilă max_score. Și capturați scorul returnat de la funcția din variabila final_score.

Ulterior, adăugăm o afirmație care verifică dacă final_score este mai mic decât 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 obținem o excepție AssertionError pentru 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 descriptiv la declarația Python 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ă revenim și să modificăm definiția funcției get_final_score pentru a remedia comportamentul neașteptat:

  • Funcția get_final_score ia, de asemenea, max_score ca parametru.
  • Verificăm dacă bonusul este adevărat. Dacă este adevărat, adăugăm 10 puncte la variabila scor.
  • Apoi, verificăm dacă scorul este mai mare decât max_score. Dacă da, returnăm max_score.
  • În caz contrar, revenim scorul.
  Creați-vă prima aplicație Jamstack cu Hugo și Netly

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ți câteva afirmații pentru a confirma că funcția funcționează acum conform așteptărilor.

O notă despre excepția AssertionError

Deși o excepție AssertionError apare atunci când expresia este evaluată la False, ar trebui să ne amintim să nu gestionăm astfel de erori ca excepții. Înseamnă că nu ar trebui să facem așa ceva:

try:
    <doing this>
except AssertionError:
    <do this>

În exemplul anterior despre get_final_score, am folosit afirmația 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 existe erori de afirmare.

Pentru asta sunt afirmațiile. Sunt verificări pentru cod și ajută la scrierea unui cod mai curat. Gestionarea excepțiilor, pe de altă parte, este de a anticipa și de a gestiona erorile neașteptate în timpul execuției. Acestea includ adesea tipuri și valori de intrare nevalide.

Pentru a rezuma, ar trebui să utilizați instrucțiunea Python assert pentru o depanare eficientă și să nu gestionați AssertionErrors ca excepții.

Concluzie

Acest tutorial v-a ajutat să înțelegeți cum să utilizați declarația assert în Python. Iată un rezumat a ceea ce ați învățat:

  • Declarațiile Python assert (aserțiuni) iau forma expresie assert. Aceasta verifică dacă expresia este adevărată. Dacă nu se evaluează la True, este generată o excepție AssertionError.
  • Puteți utiliza, de asemenea, asserția cu expresia asertă de sintaxă, mesaj. Aceasta va tipări șirul de mesaj ori de câte ori apare o excepție AssertionError.
  • Ar trebui să vă amintiți să nu implementați gestionarea excepțiilor pentru a gestiona erorile de afirmare. Și utilizați aserțiunile ca instrument util de depanare pentru verificările corecte ale codului dvs.

În calitate de dezvoltator, afirmațiile vă ajută la depanare. Pentru a vă asigura că toate componentele (modulele) individuale ale proiectului funcționează conform așteptărilor, puteți învăța cum să scrieți teste unitare în Python.

Apoi, consultați această listă de proiecte Python pentru începători la care puteți lucra.